获取数组内对象的索引,匹配条件

新手上路,请多包涵

我有一个这样的数组:

[{prop1:"abc",prop2:"qwe"},{prop1:"bnmb",prop2:"yutu"},{prop1:"zxvz",prop2:"qwrq"},...]

如何在不遍历整个数组的情况下获取与条件匹配的对象的索引?

例如,给定 prop2=="yutu" ,我想获得索引 1

我看到了 .indexOf() 但认为它用于简单的数组,如 ["a1","a2",...] 。我还检查 $.grep() 但这会返回对象,而不是索引。

原文由 amp 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 536
2 个回答

截至 2016 年,您应该为此使用 Array.findIndex (ES2015/ES6 标准):

 a = [
 {prop1:"abc",prop2:"qwe"},
 {prop1:"bnmb",prop2:"yutu"},
 {prop1:"zxvz",prop2:"qwrq"}];

 index = a.findIndex(x => x.prop2 ==="yutu");

 console.log(index);

它在 Google Chrome、Firefox 和 Edge 中受支持。对于 Internet Explorer,链接页面上有一个 polyfill。

性能说明

函数调用很昂贵,因此对于非常大的数组,一个简单的循环将比 findIndex 执行得更好:

 let test = [];

 for (let i = 0; i < 1e6; i++)
 test.push({prop: i});

 let search = test.length - 1;
 let count = 100;

 console.time('findIndex/predefined function');
 let fn = obj => obj.prop === search;

 for (let i = 0; i < count; i++)
 test.findIndex(fn);
 console.timeEnd('findIndex/predefined function');

 console.time('findIndex/dynamic function');
 for (let i = 0; i < count; i++)
 test.findIndex(obj => obj.prop === search);
 console.timeEnd('findIndex/dynamic function');

 console.time('loop');
 for (let i = 0; i < count; i++) {
 for (let index = 0; index < test.length; index++) {
 if (test[index].prop === search) {
 break;
 }
 }
 }
 console.timeEnd('loop');

与大多数优化一样,这应该谨慎应用,并且仅在实际需要时才应用。

原文由 georg 发布,翻译遵循 CC BY-SA 4.0 许可协议

如何获取与条件匹配的对象的索引(不沿数组迭代)?

你不能, 有些东西 必须遍历数组(至少一次)。

如果条件变化很大,那么你将不得不循环查看其中的对象,看它们是否符合条件。但是,在具有 ES5 功能的系统上(或者如果您安装了 shim),可以相当简洁地完成该迭代:

 var index;
yourArray.some(function(entry, i) {
    if (entry.prop2 == "yutu") {
        index = i;
        return true;
    }
});

它使用新的(ish) Array#some 函数,它循环遍历数组中的条目,直到你给它的函数返回真。我给它的函数保存匹配条目的索引,然后返回 true 以停止迭代。

或者当然,只需使用 for 循环。 这个其他答案 涵盖了您的各种迭代选项。

但是如果您总是要为此查找使用相同的属性,并且如果属性值是唯一的,您可以只循环一次并创建一个对象来映射它们:

 var prop2map = {};
yourArray.forEach(function(entry) {
    prop2map[entry.prop2] = entry;
});

(或者,同样,您可以使用 for 循环或任何 其他选项。)

然后,如果您需要找到带有 prop2 = "yutu" 的条目,您可以这样做:

 var entry = prop2map["yutu"];

我称此为数组的“交叉索引”。当然,如果您删除或添加条目(或更改它们的 prop2 值),您还需要更新映射对象。

原文由 T.J. Crowder 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题