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, время: 21:05. |