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

Marson,
<!DOCTYPE html>
<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
</head>
<body>
<h1>исходный массив</h1>
<pre>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'] }
 ];</pre>

<h1>желаемый результат</h1><pre>
[
{ name: 'Ali', close: ['Vasil', 'Wog'] },
{ name: 'Vasil', close: ['San', 'Ali'] },
{ name: 'San', close: ['Vasil', 'Zena'] },
{ name: 'Zena', close: ['Sun', 'Wog'] },
{ name: 'Wog', close: ['Zena', 'Ali'] }
]</pre>
<h1>результат работы скрипта, новый массив</h1>
<script>
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.slice().map(({name, close}) => ({name, close : [...close]})).sort(comparator); //отсортировали исходный массив, согласно списка посадки
}
document.write(`<pre>${JSON.stringify(placeGuests(arr), "", 0)}</pre>`)

  </script>
<h1>найдите разницу, ниже состояние исходного массива после обработки скриптом</h1>

<script>
document.write(`<pre>${JSON.stringify(arr, "", 0)}</pre>`)
</script>
</body>
</html>
Ответить с цитированием