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