2

你会做这种事吗?

    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

4 回答 4

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 版本,因为它可读性更好,否则使用本机代码。

* - 编辑 - *

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

于 2013-02-01T11:04:27.963 回答
2

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

至于性能,试试吧,看看你的结果是什么。

于 2013-02-01T10:55:26.913 回答
1

如果您已经对 jQuery 有依赖,那么请使用第一种方式,因为它更短且更易于阅读。在极不可能的情况下,此功能是您的瓶颈并且性能不可接受,那么您可以开始考虑替代实现。

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

于 2013-02-01T10:56:54.473 回答
0

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

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

这将返回,就像 jQuerys grep 一个数组一样,您必须在其中获取第一个值。

于 2013-02-01T11:00:00.557 回答