0

我已经排序了以下在数组中搜索对象的方法。这个问题已经被问过无数次了,但我想从以下方式中知道哪个最好。如果有另一个我也想知道。

使用$.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];
}

这样我就不需要每次都遍历整个数组。我只是检查一下lookup[id]

传统方式的for循环

function in_array(array, id) {
    for(var i=0;i<array.length;i++) {
        if(array[i].id === id) {
            return true;
        }
    }
    return false;
}

要检查元素是否存在,我会调用in_array(arr,element).

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

更新

数组将包含以下对象——

var arr = [];
var nameObj = {};

nameObj.label = "somename";
nameObj.id = 123;
arr.push(nameObj);
.
.
.
4

2 回答 2

2

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

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

一个jsfiddle示例
更多关于Array.filter旧浏览器的 shim @MDN

于 2013-05-09T22:55:59.967 回答
1

您可以使用内置的map()方法而不是循环:

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

(在 IE 8 中不支持)

于 2013-05-09T21:49:07.647 回答