Array#map
, Array#forEach
и т. Д. Никогда не предназначались для остановки.Это было бы странно, поскольку намерение map
также forEach
действительно состоит в том, чтобы перебирать все элементы.
Также я не думаю, что можно уведомить вызывающую сторону о том, что событие break
имеетпроизошло, поскольку она находится внутри функции, которая не является неотъемлемой частью исходного цикла.
Итак, давайте посмотрим на пользовательский метод, который останавливает цикл при первом появлении true
без возврата самого соответствующего значения:
Object.defineProperty(Array.prototype, 'untilTrue', {
enumerable: false,
value: function(lambda) {
for(let i in this) {
if(lambda.call(this, this[i])) return;
}
}
});
const colours = ["red", "orange", "yellow", "green", "blue", "violet"];
colours.untilTrue(item => {
if (item.startsWith("y")) {
console.log("The yessiest colour!");
return true;
}
console.log(item);
});
Сравнение этого пользовательского untilTrue
с использованием Array#find
:
const colours = ["red", "orange", "yellow", "green", "blue", "violet"];
colours.find(item => {
if (item.startsWith("y")) {
console.log("The yessiest colour!");
return true;
}
return false;
});
Единственное заметное отличие состоит в том, что untilTrue
не возвращает соответствующий элемент - Array#find
делает это в дополнение к вызову lambda
.
В общем, я просто придерживаюсь Array#find
, чтобы сохранить код чистым и чистым, и использовать его так:
const colours = ["red", "orange", "yellow", "green", "blue", "violet"];
if(colours.find(item => item.startsWith("y")) !== undefined) {
console.log("The yessiest colour!");
}
Это останавливает цикл при первом совпадении (и возвращает соответствующий элемент).Также обратите внимание, что вы должны сравнивать с undefined
- в случае, если вы искали значение false
или null
, проверка никогда не оценивается как true
, если сравнивать ее с true
.