Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
return isDone ? newList :
isMatch ? takeFirst(limit - 1, predicate, list, i + 1, [...newList, list[i]]) // <<== вот тут рекурсивный вызов
: takeFirst(limit, predicate, list, i + 1, newList) // <<== и тут
function takeFirst(limit, predicate, list, i = 0, newList = []) {
if (i >= 0 && i < list.length && newList.length < limit) {
if (predicate(list[i])) {
newList.push(list[i])
}
takeFirst(limit, predicate, list, i + 1, newList) // <<== РЕКУРСИЯ!!!!
}
return newList
}
var arr = [1, 2, 2, 3, 3, 2, 4, 5, 2, 2, 2, 2]
var isTwo = function (value) {
return value == 2
}
console.log(takeFirst(5, isTwo, arr))
const result = cats.filter(isKitten).slice(0, 5);
Какая-то странная статья. Да, лучше обходиться без break, но для этого не обязательно нужно писать такой наркоманский код, как в функции takeFirst.
Достаточно просто вынести for-цикл в отдельную функцию, и заменить break на return
function firstKittens(cats, maxNumber) {
var result = []
// старый добрый for
for (var i = 0; i < cats.length; i++) {
if (isKitten(cats[i])) {
result.push(cats[i])
if (result.length >= maxNumber) {
return result;
}
}
}
return result;
}заменить break на return
Но это не очень функционально
– ухудшилась читаемость кода;
– производительность снизилась.
А в чём плюсы описанного подхода?
/*
* takeFirst работает как `filter`, но поддерживает ограничение.
*
* @param {number} limit - Максимальное количество возвращаемых соответствий
* @param {function} predicate - Функция соответствия, принимает item и возвращает true или false
* @param {array} list - Список, который будет отфильтрован
* @param {number} [i] - Индекс, с которого начать фильтрацию (по умолчанию 0)
*/
const takeFirst = (limit, predicate, list, i = 0, newList = []) => {
const isDone = limit <= 0 || i >= list.length
const isMatch = isDone ? undefined : predicate(list[i])
return isDone ? newList :
isMatch ? takeFirst(limit - 1, predicate, list, i + 1, [...newList, list[i]])
: takeFirst(limit, predicate, list, i + 1, newList)
}

УчОные всего мира встали и пошли улучшать JS. С нетерпением жду ещё одну историю из серии "сложно о простом"
Переосмысливая JavaScript: break и функциональный подход