Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #21 (permalink)  
Старый 20.12.2019, 21:22
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,071

Marson,
мне непонятен ваш код, почему вы не составили список гостей, почему вы берёте кого попало строка 10 let result = [arr[0]]; а если первым будет не Ali а Wog
где это
Сообщение от Marson
1) сортировка по алфавиту исходного массива
что мешает использовать мой код?
Ответить с цитированием
  #22 (permalink)  
Старый 20.12.2019, 22:14
Аспирант
Отправить личное сообщение для Marson Посмотреть профиль Найти все сообщения от Marson
 
Регистрация: 14.08.2018
Сообщений: 65

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

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

    return a > b ? 1 : -1;

  })

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

Последний раз редактировалось Marson, 20.12.2019 в 22:19.
Ответить с цитированием
  #23 (permalink)  
Старый 20.12.2019, 22:26
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,071

Marson,
составьте список вначале, как будет выглядеть список гостей, если нет ни у кого друзей.
Ответить с цитированием
  #24 (permalink)  
Старый 20.12.2019, 22:31
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,071

Сообщение от Marson
первым всегда будет тот, кто первый в исходном массиве.
а куда исчезла сортировка по алфавиту?
Ответить с цитированием
  #25 (permalink)  
Старый 20.12.2019, 22:41
Аспирант
Отправить личное сообщение для Marson Посмотреть профиль Найти все сообщения от Marson
 
Регистрация: 14.08.2018
Сообщений: 65

я добавил описание
Ответить с цитированием
  #26 (permalink)  
Старый 20.12.2019, 23:05
Аспирант
Отправить личное сообщение для Marson Посмотреть профиль Найти все сообщения от Marson
 
Регистрация: 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.


Он по заданию отстортированный
Ответить с цитированием
  #27 (permalink)  
Старый 20.12.2019, 23:17
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,071

Marson,
создайте массив имён и идите циклом по этому массиву, перенося имена в результат.
Ответить с цитированием
  #28 (permalink)  
Старый 20.12.2019, 23:44
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,071

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.
Ответить с цитированием
  #29 (permalink)  
Старый 23.12.2019, 05:55
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 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));
Ответить с цитированием
  #30 (permalink)  
Старый 23.12.2019, 07:46
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,071

Malleys,
браво!!!
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как показать элементы под картой zava75 Элементы интерфейса 3 13.07.2018 18:48
Как вывести элементы по очереди каждый через несколько секунд? AsceticTr jQuery 3 27.05.2018 16:59
Как показывать/скрывать элементы с одинаковым div? Sice Javascript под браузер 6 13.11.2017 01:44
Как перерисовать все элементы SVG на Canvas (d3.js+leaflet.js+html2canvas) Trippal Общие вопросы Javascript 0 10.02.2016 18:25
Как выровнять элементы li в jquery ui tabs? 1Dmitry Элементы интерфейса 2 23.03.2013 14:58