更好的方法在数组中找到对象而不是循环?

时间:2013-04-02 14:11:55

标签: javascript jquery arrays object

实施例

链接:http://jsfiddle.net/ewBGt/

var test = [{
    "name": "John Doo"
}, {
    "name": "Foo Bar"
}]

var find = 'John Doo'

console.log(test.indexOf(find)) // output: -1
console.log(test[find]) // output: undefined

$.each(test, function(index, object) {
    if(test[index].name === find)
        console.log(test[index]) // problem: this way is slow
})

问题

在上面的例子中,我有一个包含对象的数组。我需要找到具有name = 'John Doo'

的对象

我的.each循环正在运行,但此部分将执行100次,测试将包含更多对象。所以我认为这种方式会很慢。

indexOf()无法正常工作,因为我无法在对象中搜索该名称。

问题

如何在当前数组中使用name = 'John Doo'搜索对象?

5 个答案:

答案 0 :(得分:7)

在这种情况下,我有时会做“可搜索的地图对象”。如果数组本身是静态的,则可以转换为映射,其中数组值可以是键和映射值索引。我假设值在您的示例中是唯一的。

Lo-Dash (www.lodash.com)已创建选择的utils以便轻松循环等。检查出来!

注意:但通常你真的不必担心使用100个元素循环使用数组。

答案 1 :(得分:7)

jQuery $.grep(或其他过滤功能)不是最佳解决方案。

$.grep函数将循环遍历所有数组元素,即使在循环期间已找到搜索到的对象。

来自jQuery grep文档:

  

$ .grep()方法根据需要从数组中删除项目   所有剩余的项目都通过了提供的测试测试是一个功能   传递数组项和数组中项的索引。   只有当测试返回true时,该项才会在结果数组中。

如果你的数组没有排序,没有什么可以胜过这个:

var getObjectByName = function(name, array) {

    // (!) Cache the array length in a variable
    for (var i = 0, len = test.length; i < len; i++) {

        if (test[i].name === name)
            return test[i]; // Return as soon as the object is found

    }

    return null; // The searched object was not found

}

答案 2 :(得分:3)

如果您只是想知道该值是否存在,您可以使用lodash的includes函数,如下所示:

var find = 'John Doo'

[{ "name": "John Doo" }, { "name": "Foo Bar" }].some(function (hash) {
    if (_.includes(hash, find)) return true;
});

文档:

答案 3 :(得分:0)

也许你应该在jQuery中使用$.grep功能:

var test = [{
    "name": "John Doo"
}, {
    "name": "Foo Bar"
}]

var find = 'John Doo'

var found = $.grep(test, function(obj){
    return obj['name'] == find;
});

console.log(found);

小提琴:http://jsfiddle.net/ewBGt/3/

答案 4 :(得分:0)

您唯一可以做的就是使用内置数组方法(如果可用)而不是自己进行循环 - filter方法适用于此处。

但我希望sbeliv01在他的回答中使用的jQuery这样的JS库已经在内部检查(如果这些数组方法本身不可用,则提供回退解决方案) - 所以不要指望大幅提升性能。