数组查找,本机或通过jQuery?

时间:2013-02-01 10:52:34

标签: javascript jquery performance

你会做这类事吗?

    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;
    };

为什么在正确性,可读性和性能方面你更喜欢这种方式?如果您希望以第三种方式进行,请分享。

4 个答案:

答案 0 :(得分:3)

这就是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版本,因为它更易读,否则请使用 native 代码。

* - 编辑 - *

在查看代码时,这让我意识到 会有所作为。当代码找到第一个项目(只需要一个结果)时,你的代码已经返回(并完成循环),其中jQuery循环遍历 all 项目。因此,如果您只期望一个结果,那么您的版本会更快。

答案 1 :(得分:2)

jQuery提供了方便的方法,在后台它可能会做类似的事情。如果您已经在使用jQuery,那么您可以利用这一点,但我不会仅仅为这样的一点代码包含jQuery。这完全取决于你的情况。

至于表现,请尝试一下,看看你的结果是什么。

答案 2 :(得分:1)

如果你已经依赖于jQuery,那么首先要做它,因为它更短,阅读更容易。在非常不可能的情况下,这个功能是你的瓶颈,性能是不可接受的,那么你可以开始考虑其他实现。

如果您还没有依赖jQuery,那么第二个版本更可取,因为权衡(包括jQuery与编写更多代码行)并不值得。

答案 3 :(得分:0)

我会使用原生的Array.filter(),如果你不关心Browsersupport(IE8-会死在这上面),这可能是最快的。

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

返回,就像jQuerys grep一样,你必须获取第一个值。