| 
		
			Сообщение от рони
			
		
	 | 
	| 
		но нет проверки "если друзей нет, берём следующего из основного массива"
	 | 
	
 Добавил такой поиск гостей... Думаю, что такой ответ лучше...
	
	| 
		
			Сообщение от 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));