Показать сообщение отдельно
  #18 (permalink)  
Старый 18.12.2019, 00:02
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,075

список гостей
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;) {
 /* номер гостя в очереди, если никого не найдём в его друзьях,
  возьмём первого из тех кто остался в очереди*/
 let index = 0;
 /* ищем друзей у текущего гостя */
 let friends = arr.find(obj => obj.name == current).close;
 /* кто из друзей стоит в очереди? */
 friends = friends.filter(name => presentNameParty.includes(name));
 /* если друзья в очереди, выбираем по алфавиту первого, сортировка */
 if(friends.length){
    current = friends.sort()[0];
    /* смотрим где стоит выбранный гость */
    index = presentNameParty.findIndex(name => name == current);
 }
 /* выводим гостя из очереди и сажаем за стол */
    current = presentNameParty.splice(index,1)[0]
    result.push(current)
 /* рассаживаем остальных гостей */
 }
 /* возвращаем список гостей за столом */
    return result
 /* не нравится список, верните массив обьектов
    return result.map(name => arr.find(obj => obj.name == name)
 */
 }

let list = placeGuests(arr)
document.write(list)
  </script>
Ответить с цитированием