Javascript 数组查找,本机还是通过jQuery?

Javascript 数组查找,本机还是通过jQuery?,javascript,jquery,performance,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 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;
    };
还是这类事情

    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;
    };
var getBoard2=函数(id){
对于(变量i=0;i

那么,在正确性、可读性和性能方面,您为什么会选择这种方式呢?如果你想用第三种方式,请分享。

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


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

如果你已经依赖jQuery,那么就用第一种方法,因为它比较短,阅读起来也比较容易。如果此功能是您的瓶颈且性能不可接受,那么您可以开始考虑替代实现

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

如果您不关心Browsersupport,我会使用本机版本,它可能是最快的版本(IE8-将就此消亡)


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

这就是
grep
函数的外观(jQuery v1.8.2):

grep:函数(元素、回调、inv){
var retVal,
ret=[],
i=0,
长度=元素长度;
inv=!!inv;
//遍历数组,只保存项目
//通过验证器函数的
对于(;i
基本上,您也在做同样的事情,所以在性能方面不会有太大的差异。当我查看jQuery代码时,它们总是返回一个数组,其中返回
null
。如果您已经在使用jQuery,我会选择jQuery版本,因为它可读性更好,否则使用本机代码

*--编辑--*


在查看代码时,这让我意识到它确实起到了作用。当您的代码找到第一个项(只需要一个结果)时,它已经返回(并完成循环),jQuery将循环所有项。所以,如果您只期望一个结果,那么您的版本会更快。

在这里测量:我做了一个比较:哇,dfsq!getBoard2比getBoard1快5.4倍。打翻了我的袜子。谢谢!:)请注意,它们并不完全相同,第一个返回一个数组,第二个返回一个数组object@DavidFregoli对我最后也注意到了这一点。所以我们必须检查grep的长度,把getBoard1弄得有点混乱。你认为getBoard1对于没有nix背景的新手来说更具可读性吗?我想格雷普会很快打到谷歌。。。简短是好的,但明确也同样好,不是吗?@Mithon:取决于新手。您不需要知道jQuery就可以识别谓词回调,如果您知道,那么即使
$.grep
是一个完全未知的函数,该方法的作用也是显而易见的。但这不是我在回答问题时的想法——问题并没有说“如果新手打算维护它,你会喜欢什么代码”。没有,但我确实提到了可读性。我想我认为在与新手打交道时,可读性是加倍重要的,所以这是隐含的。我的错。但是,如果新手更容易,那么老年人也会更容易。:)@米通:不一定。。。客户端JS完全是关于回调的,对于老年人来说,代码最好是惯用的。他们应该像阅读母语一样阅读这样的简单代码。你的观点很有道理。在可读性方面说服了我。然而,经济放缓了5.4倍。。没有。。本机it是显示性能增益的dfsq链接。我想,这将是构建一次性数组和包装函数调用的开销。我也更新了答案-这确实会有所不同。虽然乍一看这看起来不错,但您必须添加代码来检查生成的数组是否为非空,如果不是,则返回第一个元素。因此,它的清洁度会因此而丢失。好吧,在任何情况下都必须进行检查,无论您采用哪种方法,如果您编写
if(board)
(自定义方法检查空值)或
if(board[0])
(.filter)实际上并不重要,不是吗?此外,jQuerys grep还返回一个数组,因此您也需要使用
if(board[0])
:-pSure进行检查。在两种意义上。如果该方法返回一个数组,那么那些If将返回不同的结果。如果你的意思是,如果我们改变getBoard的含义以返回一个数组而不是一个单板,那么没有什么区别,那么我强烈反对。这样命名的函数肯定会让人们认为他们将得到一块单板,而不是一个阵列,因此几个月后出现的下一个程序员可能会编写错误的if测试。下一个程序员可能是我自己。@Mithon好吧,显然你不知道JQuerysGrep是如何工作的。事实上,它返回一个数组,就像array.filter一样。因此,两种方法的必要检查完全相同。。。如果愿意,可以将其包装在一个附加的函数包装器中
返回[0]| | null
,这样就得到了标量返回值。现在请随意撤销你的-1。我愿意。虽然我没有马上意识到。见我对大卫的评论。是的,这会使getBoard1变得浑浊,就像您的解决方案会稍微浑浊一样为了记录在案,我没有投你那一票。事实上,我会放弃你的。毕竟我要求改变