Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   как сортировать вложенные элементы по алфавиту? (https://javascript.ru/forum/misc/78945-kak-sortirovat-vlozhennye-ehlementy-po-alfavitu.html)

рони 20.12.2019 21:22

Marson,
мне непонятен ваш код, почему вы не составили список гостей, почему вы берёте кого попало строка 10 let result = [arr[0]]; а если первым будет не Ali а Wog
где это
Цитата:

Сообщение от Marson
1) сортировка по алфавиту исходного массива

что мешает использовать мой код?

Marson 20.12.2019 22:14

первым всегда будет тот, кто первый в исходном массиве. Я хочу написать сам, так как нарабатываю практику по js, но и ваш я тоже изучаю

arr[i].close.sort((a,b) => {

    return a > b ? 1 : -1;

  })

сортируем все кто в close по алфавиту

рони 20.12.2019 22:26

Marson,
составьте список вначале, как будет выглядеть список гостей, если нет ни у кого друзей.

рони 20.12.2019 22:31

Цитата:

Сообщение от Marson
первым всегда будет тот, кто первый в исходном массиве.

а куда исчезла сортировка по алфавиту?

Marson 20.12.2019 22:41

я добавил описание

Marson 20.12.2019 23:05

Поскольку входящий массив отсортирован по алфавиту, на первом месте объект с "name" == "Ali".
Там его и оствляем, и ищем соседа. В массиве "close" у этого объекта находятся "Vasil" и "Wog".
Кого из этих двоих посадить следующим, выбираем по алфавиту. В данном случае - это "Vasil".
Располагаем объект c name == "Vasil" после "Ali".
Чтобы узнать следующего, смотрим "close" у объекта "Vasil". Там находяться "San" и "Ali".
По алфавиту, из этих двоих следующим должен быть "Ali", но он уже занял свое место, поэтому
следующим будет "San". И так далее.
В итоге гости должны сидеть в следующем порядке Ali, Vasil, Sun, Zena, Wog.


Он по заданию отстортированный

рони 20.12.2019 23:17

Marson,
создайте массив имён и идите циклом по этому массиву, перенося имена в результат.

рони 20.12.2019 23:44

Marson,
вывод промежуточных результатов.
<script>
let arr = [
        { name: 'Ali', close: ['Vasil', 'Wog'] },
        { name: 'San', close: ['Vasil', 'Zena'] },
        { name: 'Vasil', close: ['San', 'Ali'] },
        { name: 'Wog', close: ['Zena', 'Ali'] },
        { name: 'Zena', close: ['San', 'Wog'] }
 ];

 function placeGuests(arr) {
 /* очередь, отсортированный список гостей, те кто реально пришёл на встречу */
 let presentNameParty = arr.map(obj => obj.name)//.sort();
 /* будущий результат, массив, первый гость из тех кто пришёл */
 let result = presentNameParty.splice(0,1);
 /* текущий (последний) гость посаженный за стол, имя гостя */
 let current = result[0];
 /* цикл  по рассадке гостей, рассаживаем очередь гостей, пока есть кого рассаживать */
 for (;presentNameParty.length;) {
 document.write(`Очередь: ${JSON.stringify(presentNameParty, "", 1)}<br>`);
 document.write(`Список гостей за столом: ${JSON.stringify(result, "", 1)}<br>`);
 document.write(`Текущий гость: ${current}<br>`);
 /* номер гостя в очереди, если никого не найдём в его друзьях,
    возьмём первого из тех кто остался в очереди*/
 let index = 0;
 /* ищем друзей у текущего гостя */
 let friends = arr.find(obj => obj.name == current).close;
  document.write(`Друзья ${current}: ${JSON.stringify(friends, "", 1)}<br>`);
 /* кто из друзей стоит в очереди? */
 friends = friends.filter(name => presentNameParty.includes(name));
  document.write(`Кто из друзей ${current} в очереди ${JSON.stringify(presentNameParty, "", 1)}, осталось: ${JSON.stringify(friends, "", 1)}<br>`);
 /* если друзья в очереди, выбираем по алфавиту первого, сортировка */
 if(friends.length){
        current = friends.sort()[0];
        /* смотрим где стоит выбранный гость */
        index = presentNameParty.findIndex(name => name == current);
 }

 /* выводим гостя из очереди и сажаем за стол */
        current = presentNameParty.splice(index,1)[0]
        result.push(current)
  document.write(`Выбрали ${current} <br>`);
 /* рассаживаем остальных гостей */
 }
 /* возвращаем список гостей за столом */
        return result
 /* не нравится список, верните массив обьектов
        return result.map(name => arr.find(obj => obj.name == name)
 */
 }

let list = placeGuests(arr)
document.write(`Список гостей за столом: ${JSON.stringify(list, "", 1)}<br>`);

    </script>

Malleys 23.12.2019 05:55

Цитата:

Сообщение от Marson
запутался в цикле

А что в нём сложного? Взять первого, и — пока есть гости, поместить очередного гостя за стол (или в массив), найти следующего подходящего гостя, конец цикла.

var persons = [
	{ name: 'Ali', close: ['Vasil', 'Wog'] },
	{ name: 'San', close: ['Vasil', 'Zena'] },
	{ name: 'Vasil', close: ['San', 'Ali'] },
	{ name: 'Wog', close: ['Zena', 'Ali'] },
	{ name: 'Zena', close: ['Sun', 'Wog'] }
];

function placeGuests(guests) {
	const placedGuests = []
	const next = guest => Array.from(guest.close).sort()
		.map(name => guests.find(guest => guest.name === name))
		.find(person => person && !placedGuests.includes(person))
	for(let guest = guests[0]; guest != null; guest = next(guest)) {
		placedGuests.push(guest)
	}
	return placedGuests
}

console.log(placeGuests(persons));

рони 23.12.2019 07:46

Malleys,
браво!!! :)


Часовой пояс GMT +3, время: 21:05.