Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   как сортировать вложенные элементы по алфавиту? (https://javascript.ru/forum/misc/78945-kak-sortirovat-vlozhennye-ehlementy-po-alfavitu.html)

Marson 25.11.2019 23:51

как сортировать вложенные элементы по алфавиту?
 
Дан список гостей.
 У каждого есть имя и список имен близких друзей, с кем человек себя комфортно чувствует.
 Изначально список отсортирован по алфавиту (по полю "name").
 Посадите гостей за круглый стол так, чтобы человека окружали только его близкие друзья.
 Отдавая предпочтение списку по алфавиту.
 
 Например:
 
 Входящий массив (аргумент "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'] }
 ]

 Поскольку входящий массив отсортирован по алфавиту, на первом месте объект с "name" == "Ali".
 Там его и оствляем, и ищем соседа. В массиве "close" у этого объекта находятся "Vasil" и "Wog".
 Кого из этих двоих посадить следующим, выбираем по алфавиту. В данном случае - это "Vasil".
 Располагаем объект c name == "Vasil" после "Ali".
 Чтобы узнать следующего, смотрим "close" у объекта "Vasil". Там находяться "San" и "Ali".
 По алфавиту, из этих двоих следующим должен быть "Ali", но он уже занял свое место, поэтому
 следующим будет "San". И так далее.
 В итоге гости должны сидеть в следующем порядке Ali, Vasil, Sun, Zena, Wog.
 
 В результате выполнения вашего кода должен получиться отсортированный массив,
 который необходимо передать в вызов функции "finish".
 В данном примере, этот массив будет выглядеть следующим образом
  
[
    { 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'] }    
 ]


нужно применить map() и sort()?

рони 26.11.2019 00:52

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'] }
 ];

const setName = new Set(arr.map(({name}) => name));
let curent = 'Ali'
let list = [curent];
for (let i = 0; i < arr.length-1; i++) {
        let {close} = arr.find(({name}) => name == curent);
        curent = close.find( name => setName.has(name) && !list.includes(name))
        if(!curent) {
          [curent, ...a] = setName;
        }
        list.push(curent);
        setName.delete(curent)
}
console.log(list)
list = list.map(n => arr.find(({name}) => name == n))
console.table(list)

Marson 26.11.2019 08:38

А если будет массив с другими именами, можно же сделать общее решение для любых данных?

рони 26.11.2019 09:09

Цитата:

Сообщение от Marson
А если

вы проверили этот код с другими данными?
разве что вместо let curent = 'Ali'
сделать
let curent = arr[0].name;

Marson 26.11.2019 13:46

проверял работает, спасибо. Хочу написать общую функцию:

function placeGuests (arr) {
  let result = [];
  
  ........
  
  return result;
}

рони 26.11.2019 14:37

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))

Marson 26.11.2019 15:03

Спасибо, код крутой, но мне как начинающему не всё понятно..
Думал код должен быть по проще, буду разбираться..

рони 26.11.2019 15:32

Marson,
добавил пояснение.

Marson 15.12.2019 15:52

подскажите как найти в close следующего ближайшего друга и вставить его следующим в name или сразу всем объектом с нужным name and close, а то который уже усажен убрать и взять второго. Нужно вывести новый массив, т.е. сделать push() в result. Нельзя чтобы входной массив мутировал и выводился, нужно вывести новый массив. имена в close я расставил по алфавиту..

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: ['Sun', 'Wog'] }
 ]


 function placeGuests (arr) { 
  let result = [];
 arr.forEach((item, index, array) => {
  item.close.sort((a,b) => { 
    return a > b ?  1 : -1;
  })
     item.close.filter((arr, i) => {
       
        }      
})
  })
  return result;
}

console.log(placeGuests(arr))

рони 15.12.2019 16:06

Marson,
не понимаю, может покажите результат, который хотите получить?

Marson 15.12.2019 18:59

Дан список гостей.
У каждого есть имя и список имен близких друзей, с кем человек себя комфортно чувствует.
Изначально список отсортирован по алфавиту (по полю "name").
Посадите гостей за круглый стол так, чтобы человека окружали только его близкие друзья.
Отдавая предпочтение списку по алфавиту.

Например:

Входящий массив (аргумент "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'] }
]

Поскольку входящий массив отсортирован по алфавиту, на первом месте объект с "name" == "Ali".
Там его и оствляем, и ищем соседа. В массиве "close" у этого объекта находятся "Vasil" и "Wog".
Кого из этих двоих посадить следующим, выбираем по алфавиту. В данном случае - это "Vasil".
Располагаем объект c name == "Vasil" после "Ali".
Чтобы узнать следующего, смотрим "close" у объекта "Vasil". Там находяться "San" и "Ali".
По алфавиту, из этих двоих следующим должен быть "Ali", но он уже занял свое место, поэтому
следующим будет "San". И так далее.
В итоге гости должны сидеть в следующем порядке Ali, Vasil, Sun, Zena, Wog.

В результате должно получится:

[
{ 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'] }
]

рони 15.12.2019 19:17

Цитата:

Сообщение от Marson
В результате должно получится:

что не устраивает в коде из поста #6

Marson 15.12.2019 19:20

мутация объектов в массиве происходит, а нужно просто в result запушить. Я не прошу чтобы вы именно написали мне код, можете объяснить как это сделать? Мне важно понимать как всё происходит. Я начал код писать, а дальше застопорился

рони 15.12.2019 19:39

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>

Marson 17.12.2019 17:10

Помогите понять как дописать мой код, а то запутался в цикле. В целом нужно написать по этому алгоритму: 1) сортировка по алфавиту исходного массива
2) массив результатов с первым
3) цикл, который
берет у каждого close, копирует close, отфильтровывает тех, кто уже есть в массиве-результате
пушит того, кто остался в close если есть хоть кто-то.

Берем первого гост, сажаем
За столом один человек
Берем close
Ищем имя второго
Потом шерстим изначальный список по алфавиту
И сажаем второго
Берем его close...

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 result = [];
  let obj = arr[0]
  result.push(arr[0])
  
 arr.forEach((item, index, array) => {
  item.close.sort((a,b) => { 
    return a > b ? 1 : -1; 
  })
    })

for(var i=0; i<=arr.length; i++){
   for(let key in arr[i]){
     if(obj.close[0] === arr[i][key] || obj.close[1] === arr[i][key]){
       obj = arr[i]
       result.push(obj)
     }
}
} 
  return result;
 }

console.log(placeGuests(arr));


Я пока только к такому решению пришёл, только двоих получается усадить как надо за стол

рони 17.12.2019 17:33

Marson,
я же вам всё расписал ...
item.close.sort зачем это?

Marson 17.12.2019 18:44

сортируем соседей по алфавиту, а потом берём первого или второго. Ваш код сложный. Суть моего задания посадить всех людей за стол(в пустой массив), в result = []

рони 18.12.2019 00:02

список гостей
 
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>

Marson 18.12.2019 01:40

спасибо за отзывчивость

Marson 20.12.2019 21:08

вы можете пожалуйста помочь мне дописать мой код? В конце не могу правильно рассадить гостей, т.е запушить в result. В конце нужно из arr[0] взять close, в нём найти первого сравнить с closeFilter[0] и запушить, потом из того кого запушили, с ним тоже самое сделать..

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 result = [arr[0]];

  for(var i=0; i<arr.length; i++){
сортируем всех кто в close по алфавиту
      arr[i].close.sort((a,b) => { 
    return a > b ? 1 : -1; 
  })

отсортировываем тех, кто уже усажен из всех close, убираем
   var closeFilter = arr[i].close.filter(closeName => {
        return !result.find(friend => {
        return closeName === friend.name
  })
  })
здесь нужно запушить того, кто ещё не усажен
  var users = arr.filter(el => {
    var currentUser = arr[0]
    currentUser = el
    return currentUser.close.find(u => {
    return u === closeFilter[0]
    })
  }) 
    result.push()  
  }
        
  return result;
 }

console.log(placeGuests(arr));

рони 20.12.2019 21:22

Marson,
мне непонятен ваш код, почему вы не составили список гостей, почему вы берёте кого попало строка 10 let result = [arr[0]]; а если первым будет не Ali а Wog
где это
Цитата:

Сообщение от Marson
1) сортировка по алфавиту исходного массива

что мешает использовать мой код?

Marson 20.12.2019 22:14

первым всегда будет тот, кто первый в исходном массиве. Я хочу написать сам, так как нарабатываю практику по js, но и ваш я тоже изучаю

arr[i].close.sort((a,b) => {

    return a > b ? 1 : -1;

  })

сортируем все кто в close по алфавиту

рони 20.12.2019 22:26

Marson,
составьте список вначале, как будет выглядеть список гостей, если нет ни у кого друзей.

рони 20.12.2019 22:31

Цитата:

Сообщение от Marson
первым всегда будет тот, кто первый в исходном массиве.

а куда исчезла сортировка по алфавиту?

Marson 20.12.2019 22:41

я добавил описание

Marson 20.12.2019 23:05

Поскольку входящий массив отсортирован по алфавиту, на первом месте объект с "name" == "Ali".
Там его и оствляем, и ищем соседа. В массиве "close" у этого объекта находятся "Vasil" и "Wog".
Кого из этих двоих посадить следующим, выбираем по алфавиту. В данном случае - это "Vasil".
Располагаем объект c name == "Vasil" после "Ali".
Чтобы узнать следующего, смотрим "close" у объекта "Vasil". Там находяться "San" и "Ali".
По алфавиту, из этих двоих следующим должен быть "Ali", но он уже занял свое место, поэтому
следующим будет "San". И так далее.
В итоге гости должны сидеть в следующем порядке Ali, Vasil, Sun, Zena, Wog.


Он по заданию отстортированный

рони 20.12.2019 23:17

Marson,
создайте массив имён и идите циклом по этому массиву, перенося имена в результат.

рони 20.12.2019 23:44

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>

Malleys 23.12.2019 05:55

Цитата:

Сообщение от Marson
запутался в цикле

А что в нём сложного? Взять первого, и — пока есть гости, поместить очередного гостя за стол (или в массив), найти следующего подходящего гостя, конец цикла.

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));

рони 23.12.2019 07:46

Malleys,
браво!!! :)

рони 23.12.2019 07:51

Malleys,
но нет проверки "если друзей нет, берём следующего из основного массива"
var persons = [
	{ name: 'Ali', close: ['Arno'] },
	{ 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 23.12.2019 08:13

Цитата:

Сообщение от рони
но нет проверки "если друзей нет, берём следующего из основного массива"

Добавил такой поиск гостей... Думаю, что такой ответ лучше...

Цитата:

Сообщение от Marson
запутался в цикле

А что в нём сложного? Взять первого, и — пока есть гости, поместить очередного гостя за стол (или в массив), найти следующего подходящего гостя (даже если не друзья, чтобы все были усажены), конец цикла.
var persons = [
	{ name: 'Ali', close: ['Arno'] },
	{ 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 waitingGuest = person => person && !placedGuests.includes(person)
	const next = guest => Array.from(guest.close).sort()
		.map(name => guests.find(guest => guest.name === name))
		.find(waitingGuest) || guests.find(waitingGuest)
	for(let guest = guests[0]; guest != null; guest = next(guest)) {
		placedGuests.push(guest)
	}
	return placedGuests
}

console.log(placeGuests(persons));

рони 23.12.2019 09:09

Malleys,
ок

Marson 01.01.2020 14:24

function placeGuests (arr) {
 let result = [arr[0]];
 let currentUser = arr[0];
  
while(arr.length!==result.length){
  arr.forEach(el => el.close.sort((a,b) => 
     a > b ? 1 : -1
  ))
  let closeFilter = currentUser.close.filter(closeName => 
         !result.find(friend => 
         closeName === friend.name))

 let user = arr.find(el => el.name === closeFilter[0])
 currentUser = user
      result.push(user)
}     
  return result;
}
Я такой код написал) Всех с Новым годом!


Часовой пояс GMT +3, время: 16:12.