Найти массив, изначально или через jQuery?

Вы бы сделали это?

    var getBoard1 = function(id) {
        return $.grep(me.boards, function (board) {
            return board.Id == id;
        });
    };

Или такого рода вещи?

    var getBoard2 = function(id) {
        for (var i = 0; i < me.boards.length; i++) {
            var board = me.boards[i];
            if (board.Id == id)
                return board;
        }
        return null;
    };

И почему, в контексте правильности, удобочитаемости и производительности, вы бы предпочли этот способ? Если вы предпочтете сделать это третьим способом, поделитесь им.

Ответ 1

Вот что выглядит функция grep (jQuery v1.8.2):

grep: function( elems, callback, inv ) {
    var retVal,
        ret = [],
        i = 0,
        length = elems.length;
    inv = !!inv;

    // Go through the array, only saving the items
    // that pass the validator function
    for ( ; i < length; i++ ) {
        retVal = !!callback( elems[ i ], i );
        if ( inv !== retVal ) {
            ret.push( elems[ i ] );
        }
    }

    return ret;
}

По существу, вы делаете то же самое, так что это не будет иметь большого значения, когда дело доходит до производительности. Когда я смотрю на код jQuery, они всегда возвращают массив, в который вы возвращаете null. Если вы уже используете jQuery, я бы пошел на версию jQuery, так как это было более читаемым, в противном случае - с собственным кодом.

* - EDIT - *

При взгляде на код это заставило меня понять, что это имеет значение. Ваш код уже возвращает (и заканчивает цикл), когда он обнаружил первый элемент (ожидающий только одного единственного результата), где jQuery перемещается по всем элементам. Итак, если вы ожидаете только одного результата, ваша версия будет быстрее.

Ответ 2

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

Что касается производительности, попробуйте, посмотрите, какие у вас результаты.

Ответ 3

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

Если вы еще не зависите от jQuery, тогда вторая версия предпочтительнее, потому что компромисс (в том числе jQuery и запись нескольких строк кода) не стоит.

Ответ 4

Я бы использовал собственный Array.filter(), который, вероятно, самый быстрый, если вы не заботитесь о Browsersupport (IE8- умрет на этом).

a.filter(function(e){return e.id == id});

Это возвращает то же, что и jQuerys grep, где вам нужно будет получить первое значение.