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

Better way to find object in array instead of looping?

本文关键字:循环 方法 更好 数组 查找 对象      更新时间:2023-09-26

示例

链接: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'的对象?

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
}

在这种情况下,我有时会做"可搜索的地图对象"。如果数组本身是静态的,则可以转换为映射,其中数组值可以是键,映射值可以是索引。我认为价值观是独一无二的,就像你的例子一样。

Lo Dash(www.lodash.com(为轻松循环等创建了一系列实用程序。看看吧!

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

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

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

文件:

  • _.includes((
  • Array.prototype.some((

也许您应该在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);

Fiddle:http://jsfiddle.net/ewBGt/3/

您唯一能做的就是优先使用内置数组方法(如果可用(,而不是自己进行循环——filter方法在这里适用。

但我预计,像sbeliv01在他的回答中使用的jQuery这样的JS库已经在内部检查了这一点(如果这些数组方法在本机中不可用,则提供一个后备解决方案(,所以不要指望会有巨大的性能提升。