Учитывая массив и предикат, найдите первый соответствующий элемент

Есть ли существующая функция, которая находит первый элемент массива, который соответствует некоторому обычному предикату?

$.fn.findFirstMatching = function(predicate) {
    var result;
    $.each(this, function(index, value) {
        if (predicate(index, value)) {
            result = {index: index, value: value};
        }
    });
    if (result) {
        return result;
    }
};

Ответ 1

Если вы используете underscore.js, вы можете использовать метод find. Он работает даже с объектами jQuery, сохраняющими коллекцию элементов без проблем.

_.find(array, function(value,index) { /* predicate */ });

Но помимо этой дополнительной (но небольшой) библиотеки вам нужно написать ее самостоятельно.

Ответ 2

Другое решение:

$.grep(yourArray, function (value, index) { return value == 42 } )[0]

Обратите внимание, что порядок аргументов должен быть value, index

Документы для jQuery.grep.

Конечно, использование _underscore гораздо более элегантно и эффективно (поскольку $.grep применяет предикат для всех элементов массива, он не останавливается после первого совпадения), но в любом случае :)

Ответ 3

Начиная с ES2015, вы можете использовать Array.prototype.find

Пример его использования выглядит так:

// outputs the first odd number
console.log([2,4,10,5,7,20].find(x => x%2))

Ответ 4

Пользовательская реализация может быть довольно короткой и все еще читаемой:

function findFirst(array, predicate) {
  for (var i = 0; i < array.length; i++) if (predicate(array[i])) return array[i];
}

Это возвращает первый элемент, соответствующий предикату (или неопределенный), а затем останавливает итерацию - это может быть удобно для огромных массивов или если функция предиката является сложной.