JQuery Grep Альтернативы возврату одного предмета

Я смотрю на некоторый код jQuery, который я пишу в данный момент, и это просто выглядит странно для моего мозга С#. Есть ли лучший способ сделать это?

var idToLookFor = 2;
var myArray = [{id:1},{id:2},{id:3}]

var arrayItem = $.grep(myArray , function (elm) {
    return elm.id == idToLookFor;
});

var itemFound = arrayItem[0];

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

Ответ 1

Этот ответ на другой вопрос указывает, что grep продолжит цикл по массиву даже после того, как он найдет правильный ответ. Не проблема в приведенном выше примере, но если ваш массив может быть намного больше, стоит отметить: не grep-решение

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

Я публикую измененную версию ответа только потому, что вы можете видеть, что я имею в виду, прежде чем решить, хотите ли вы перейти по ссылке:

for (var i = 0, len = myArray.length; i < len; i++) 
{
    if (myArray[i].id === idToLookFor)
    {
        return myArray[i]; // Return as soon as the object is found
    }
}

Ответ 2

Хорошо, если вам нравится использовать универсальный стиль jQuery, вы можете добавить что-то подобное в свою личную библиотеку:

$.extend( {
    findFirst: function( elems, validateCb ){
        var i;
        for( i=0 ; i < elems.length ; ++i ) {
            if( validateCb( elems[i], i ) )
                return elems[i];
        }
        return undefined;
    }
} );

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

var result = $.findFirst( myArray, function(elm) {
    return elm.id == idToLookFor;
});

Конечно, вы могли бы использовать свое собственное пространство имен...

Я предполагаю, что ваша озабоченность связана с читабельностью кода. Я думаю, что использование прямого решения для петли языка для этого вопроса также довольно хорошо.

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

Ответ 3

Расширение комментария Blazemonger:

var itemFound = myArray[idToLookFor - 1]

должен получить вам предмет, который вы ищете, если я правильно понял ваш вопрос. Обратите внимание на -1 для учета индексации из 1

EDIT: это также предполагает, что массив всегда будет сортироваться по возрастанию по идентификатору, как в вашем вопросе. Если ваш идентификатор делает прирост красиво, но массив сначала не сортируется ими: Сортировка массива объектов по значению свойства строки в JavaScript

Ответ 4

Если у вас есть массив объектов, это будет делать:

var result = myArray.filter(function(v) {
    return v.id === idToLookFor; 
})[0];

Для простого массива Вы можете использовать inArray. Он возвращает ключ массива, в котором присутствует элемент!

var itemFound = myArray [$. inArray (idToLookFor, myArray)];

Ответ 5

Пожалуйста, используйте

var idToLookFor = 2;
var myArray = [{id:1},{id:2},{id:3}]

var arrayItem = $.map(myArray , function (elm) {
    if(elm.id == idToLookFor)
      return elm.id ;
});

var itemFound = arrayItem[0];

Ответ 6

проверьте мой ответ здесь

Скопировано из кода Array.prototype.find для polyfill Array.find и добавлено в качестве первого параметра.

Вы можете передать критерий поиска в качестве предиката