Вчера на сайте codesignal решал интересное задание сортировка людей по их росту в парке не трогая деревья.
В парке есть люди разного роста и деревья задача отсортировать людей не трогая деревья.
Вход дается массив такого рода [-1, 150, 190, 170, -1, -1, 160, 180] на выходе надо получить такой массив [-1, 150, 160, 170, -1, -1, 180, 190].
-1 (деревья) не трогаем остальное сортируем.
Я сделал данную задачу может и криво но вопрос не в этом.Вопрос в том что лучший ответ был следующий
const arr = [-1, 150, 190, 170, -1, -1, 160, 180];
function sortByHeight(a) {
var s = a.filter(h => h > 0).sort((a, b) => a - b);
console.log(s);
return a.map(p => {
if (p !== -1) {
return s.shift();
}
return -1;
})
}
console.log(sortByHeight(arr)); // [-1, 150, 160, 170, -1, -1, 180, 190]
И мне очень трудно понять его работу.
То есть почему если написать console.log(s) после вот этой строки var s = a.filter(h => h > 0).sort((a, b) => a - b) мне показывает пустой массив ?
Там же должно быть что то вроде вот такого массива
[150, 160, 170, 180, 190]
Почему он удаляет первый элемент пустого массива вот тут return s.shift();?
Надо чтобы кто нибудь объяснил работу этого кода полностью.Спасибо заранее.
s. как по мне выводит нужный массив. – teran Oct 28 '19 at 09:09-1то оставляем, иначе берем первый элемент из сортированных/shiftудаляет первый и возвращает его. То есть нам просто нужно каждый раз делать такой сдвиг, и будем получать нужные значения в нужном порядке. – teran Oct 28 '19 at 09:11console.logздесь в сниппет в вопросе. все работает как и ожидается. – teran Oct 28 '19 at 09:20console.log, потому что браузер отображает последнее значение массива, а в Вашем случае - из этого массива уже удалены (s.shift()) все элементы – Dmytro Oct 28 '19 at 09:30