Показать сообщение отдельно
  #6 (permalink)  
Старый 26.11.2019, 14:37
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

Marson,
const arr = [
        { 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(arr) {
    const collator = new Intl.Collator(["en", "ru"], {numeric: true});//создали сортировщик
    let comparator = (a, b) => collator.compare(a, b);//создали функцию сортировки
    let [curent, ...list] = arr.map(({name}) => name).sort(comparator);//получили список имён по алфавиту ["Ali", "San", "Vasil", "Wog", "Zena"]
    const setName = new Set(list); // ["San", "Vasil", "Wog", "Zena"] список имён для списка посадки
    list = [curent];//['Ali'] список посадки
    for(;setName.size;) { // пока список имён не пуст
    let {close} = arr.find(({name}) => name == curent);// нашли друзей Ali ['Vasil', 'Wog']
    curent = close.find( name => setName.has(name)); // нашли 'Vasil'
    if(!curent) [curent, ..._] = setName; //если в списке друзей нет подходящего, берём первого из списка имён
    list.push(curent);//добавили друга в список посадки
    setName.delete(curent)//удалили друга из списка имён
    };
   //создали список посадки list ["Ali", "Vasil", "San", "Zena", "Wog"]
    comparator = (a, b) => collator.compare(list.indexOf(a.name), list.indexOf(b.name));//создали функцию сортировки согласно местам посадки
    return arr.sort(comparator); //отсортировали исходный массив, согласно списка посадки
}
console.table(placeGuests(arr))

Последний раз редактировалось рони, 26.11.2019 в 15:33.
Ответить с цитированием