Javascript 哪种方法最适合在数组中搜索对象?

Javascript 哪种方法最适合在数组中搜索对象?,javascript,jquery,arrays,processing-efficiency,Javascript,Jquery,Arrays,Processing Efficiency,我对以下方法进行了排序,以搜索数组中的对象。 这个问题已经被问了无数次了,但我想知道以下哪种方法最好。如果还有别的,我也想知道 使用$.grep() function is_in_array(arr,element){ var result = $.grep(arr, function(e){ return e.id == element; }); return result.length; } 上述函数返回数组的长度 元素不存在时为0 1当元素存在时 如果存在多个具有相同值

我对以下方法进行了排序,以搜索数组中的对象。 这个问题已经被问了无数次了,但我想知道以下哪种方法最好。如果还有别的,我也想知道

使用
$.grep()

function is_in_array(arr,element){
    var result = $.grep(arr, function(e){ return e.id == element; });
    return result.length;
}
上述函数返回数组的长度

  • 元素不存在时为0
  • 1当元素存在时
  • 如果存在多个具有相同值的元素,则长度>1
使用查找对象

var lookup = {};
for (var i = 0, len = array.length; i < len; i++) {
    lookup[array[i].id] = array[i];
}
要检查元素是否存在,我需要调用数组(arr,element)中的

哪种方法最好?这个问题听起来很重复,但我只想确定这三个问题中哪一个是最好的

更新

数组将包含如下对象--


您可以使用内置方法而不是循环:

var lookup=array.map(function(e){return e.id;});

(IE 8中不支持)

您可以使用内置方法而不是循环:

var lookup=array.map(function(e){return e.id;});

(IE 8中不支持)

您还可以结合使用
JSON
(用于比较)和
数组。filter
方法:

var findvalue = JSON.stringify([somevalue]),
    ,found = [array].filter(
               function(a){return JSON.stringify(a) === findvalue;}).length
;
// found > 0 means: findvalue found
一个例子

有关
Array.filter
和适用于较旧浏览器的垫片的详细信息

您还可以结合使用
JSON
(用于比较)和
Array.filter
方法:

var findvalue = JSON.stringify([somevalue]),
    ,found = [array].filter(
               function(a){return JSON.stringify(a) === findvalue;}).length
;
// found > 0 means: findvalue found
一个例子

关于
Array的更多信息。过滤器
和旧浏览器的垫片

查找是执行多次的最快方法。使用for循环迭代数组,并在Array[i]
@adeneo中执行
返回键-只检查存在,而不检查值,它会命中固有的道具,当一个循环就可以工作时,执行循环反循环是很慢的。@adeneo yea,就像上一个方法中提到的那样?dandavis我也觉得这对多次查找很好。我会做一些类似的事情??查找是执行多次的最快的。使用for循环迭代数组,并在数组中执行
返回键[i]
@adeneo-这只检查存在,而不是值,它会命中固有的道具,当一个循环就可以工作时,执行循环反循环是很慢的。@adeneo yea,就像上一个方法中提到的那样?dandavis我也觉得这对多个查找有好处。我会做一些类似的事情??您也可以使用jQuery对IE8支持的相同实现:
$.map(函数(e){returne e.id;})它不应该更快或更高效,而且在imo中看起来也不会更干净。您也可以使用jQuery的实现来支持IE8:
$.map(函数(e){return e.id;})它不应该更快或更高效,而且在我看来也不会更干净。小提琴+1。所有的评论和回答都很有价值,提高了我的知识水平。我将接受这个答案。:)+1号小提琴。所有的评论和回答都很有价值,提高了我的知识水平。我将接受这个答案。:)