6

例子

链接: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'在当前数组中搜索对象?

4

5 回答 5

7

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

Lo-Dash (www.lodash.com ) 已经创建了用于轻松循环等的实用程序选择。看看吧!

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

于 2013-04-02T14:27:25.453 回答
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

}
于 2013-04-02T14:53:36.860 回答
3

如果你只是想知道值是否存在,你可以includes像这样使用 lodash 的函数:

var find = 'John Doo'

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

文档:

于 2014-08-27T18:52:01.617 回答
0

也许您应该使用$.grepjQuery 中的功能:

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/

于 2013-04-02T14:17:41.763 回答
0

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

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

于 2013-04-02T15:13:18.757 回答