20.12.2019, 21:22
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
Marson,
мне непонятен ваш код, почему вы не составили список гостей, почему вы берёте кого попало строка 10 let result = [arr[0]]; а если первым будет не Ali а Wog
где это
Сообщение от Marson
|
1) сортировка по алфавиту исходного массива
|
что мешает использовать мой код?
|
|
20.12.2019, 22:14
|
Аспирант
|
|
Регистрация: 14.08.2018
Сообщений: 65
|
|
первым всегда будет тот, кто первый в исходном массиве. Я хочу написать сам, так как нарабатываю практику по js, но и ваш я тоже изучаю
arr[i].close.sort((a,b) => {
return a > b ? 1 : -1;
})
сортируем все кто в close по алфавиту
Последний раз редактировалось Marson, 20.12.2019 в 22:19.
|
|
20.12.2019, 22:26
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
Marson,
составьте список вначале, как будет выглядеть список гостей, если нет ни у кого друзей.
|
|
20.12.2019, 22:31
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
Сообщение от Marson
|
первым всегда будет тот, кто первый в исходном массиве.
|
а куда исчезла сортировка по алфавиту?
|
|
20.12.2019, 22:41
|
Аспирант
|
|
Регистрация: 14.08.2018
Сообщений: 65
|
|
я добавил описание
|
|
20.12.2019, 23:05
|
Аспирант
|
|
Регистрация: 14.08.2018
Сообщений: 65
|
|
Поскольку входящий массив отсортирован по алфавиту, на первом месте объект с "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
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
Marson,
создайте массив имён и идите циклом по этому массиву, перенося имена в результат.
|
|
20.12.2019, 23:44
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
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>
Последний раз редактировалось рони, 20.12.2019 в 23:53.
|
|
23.12.2019, 05:55
|
|
Профессор
|
|
Регистрация: 20.12.2009
Сообщений: 1,714
|
|
Сообщение от 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
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
Malleys,
браво!!!
|
|
|
|