Подтвердить что ты не робот

Получить первый элемент коллекции, который соответствует функции итератора

Я хотел бы достичь чего-то вроде _.first с _.filter, то есть с набором элементов, я бы хотел получить первый (если существует), который соответствует тесту правды (итератор).

Например, для массива, подобного следующему:

var arr = [{a: 1}, {a: 5}, {a: 9}, {a: 11}, {a: 15}]

Я хотел бы получить первый (и только первый) элемент, который соответствует моей пользовательской функции:

_.filterFirst(arr, function(el) { return el.a > 10; }); // make it

До сих пор:

_.first(arr) == {a:1}
_.filter(arr, function(...)) == [{a:11}, {a:15}]

Есть ли чистое решение, которое лучше, чем _.first(_.filter(arr, iterator))?

4b9b3361

Ответ 1

Вы можете использовать find:

Просматривает каждое значение в списке, возвращая первое, которое проходит тест истины (итератор) или undefined, если значение не проходит контрольная работа. Функция возвращает, как только находит приемлемый элемент, и не пересекает весь список.

Используя ваш пример:

var g = _.find(arr, function (x) { return x.a > 10 })

См. главную страницу: http://underscorejs.org

Еще одно замечание (которое может быть вашим вопросом) - это функция chain для объединения вызовов:

var g = _.chain(arr).filter(function (x) { return x.a > 10 }).first().value()

Обратите внимание на вызовы filter и `first ', которые могут следовать друг за другом без какой-либо вложенности.

Ответ 2

"_. find" является хорошим решением.

Альтернативным решением, возможно, быстрее, является использование "Array.prototype.every" следующим образом:

var match;
arr.every(function(x) { if (x.a > 10) { match = x; return false;} return true; })