Marson,
мне непонятен ваш код, почему вы не составили список гостей, почему вы берёте кого попало строка 10 let result = [arr[0]]; а если первым будет не Ali а Wog где это Цитата:
|
первым всегда будет тот, кто первый в исходном массиве. Я хочу написать сам, так как нарабатываю практику по js, но и ваш я тоже изучаю
arr[i].close.sort((a,b) => {
return a > b ? 1 : -1;
})
сортируем все кто в close по алфавиту |
Marson,
составьте список вначале, как будет выглядеть список гостей, если нет ни у кого друзей. |
Цитата:
|
я добавил описание
|
Поскольку входящий массив отсортирован по алфавиту, на первом месте объект с "name" == "Ali".
Там его и оствляем, и ищем соседа. В массиве "close" у этого объекта находятся "Vasil" и "Wog". Кого из этих двоих посадить следующим, выбираем по алфавиту. В данном случае - это "Vasil". Располагаем объект c name == "Vasil" после "Ali". Чтобы узнать следующего, смотрим "close" у объекта "Vasil". Там находяться "San" и "Ali". По алфавиту, из этих двоих следующим должен быть "Ali", но он уже занял свое место, поэтому следующим будет "San". И так далее. В итоге гости должны сидеть в следующем порядке Ali, Vasil, Sun, Zena, Wog. Он по заданию отстортированный |
Marson,
создайте массив имён и идите циклом по этому массиву, перенося имена в результат. |
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>
|
Цитата:
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));
|
Malleys,
браво!!! :) |
| Часовой пояс GMT +3, время: 14:08. |