Учитывая массив и предикат, найдите первый соответствующий элемент
Есть ли существующая функция, которая находит первый элемент массива, который соответствует некоторому обычному предикату?
$.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];
}
Это возвращает первый элемент, соответствующий предикату (или неопределенный), а затем останавливает итерацию - это может быть удобно для огромных массивов или если функция предиката является сложной.
Ответ 5
Использовать метод inArray для jquery
Вы можете легко узнать индекс вашего искомого элемента.