在对象数组中,以最快的方式查找属性与搜索匹配的对象的索引

Pet*_*rov 129 javascript arrays indexof

我一直在尝试寻找一种有效的方法,但我已经无处可去.我有一个对象数组,如下所示:

array[i].id = some number;
array[i].name = some name;
Run Code Online (Sandbox Code Playgroud)

我想要做的是找到id等于的对象的INDEXES,例如,0,1,2,3或4中的一个.我想我可以做类似的事情:

var indexes = [];
for(i=0; i<array.length; i++) {
  (array[i].id === 0) ? { indexes[0] = i }
  (array[i].id === 1) ? { indexes[1] = i }
  (array[i].id === 2) ? { indexes[2] = i }
  (array[i].id === 3) ? { indexes[3] = i }
  (array[i].id === 4) ? { indexes[4] = i }
}
Run Code Online (Sandbox Code Playgroud)

虽然这可行,但它看起来相当昂贵且缓慢(更不用说丑陋),特别是如果array.length可能很大.关于如何修饰这一点的任何想法?我想过以某种方式使用array.indexOf,但我没有看到如何强制语法.这个

array.indexOf(this.id === 0);
Run Code Online (Sandbox Code Playgroud)

例如,返回undefined,因为它可能应该.提前致谢!

Pab*_*lgo 373

也许你想使用更高阶的函数,比如"map".假设您想通过'field'属性进行搜索:

var elementPos = array.map(function(x) {return x.id; }).indexOf(idYourAreLookingFor);
var objectFound = array[elementPos];
Run Code Online (Sandbox Code Playgroud)

  • 这个答案很棒,因为它实际上通过提供索引来回答问题:) (9认同)
  • @ZeroAbsolute您应用的函数(传递给map)可以返回一个哈希字符串,该字符串应为您的条件给出的每种可能组合提供唯一键.例如:`function hashf(el){return String(el.id)+"_"+ String(el.name); }`.这只是一个提示:`elementPos = array.map(hashf(x)).indexOf(hash({id:3,name:'Pablo'}));`显然,我提供的哈希函数对所有人都无效因为''_'`可能构成你的值的一部分,但它只是一个快速的例子,你可以找出不同的哈希方法. (3认同)
  • 大家好,除了使用两种方法 `map, indexOf` 你可以只使用一种叫做 `findIndex` ...... 例如:`[{id:1},{id:2},{id:3}, {id:4}].findIndex(function(obj){return obj.id == 3}) 或 [{id:1},{id:2},{id:3},{id:4}]。 findIndex(obj =&gt; obj.id == 3) ` (3认同)

Uma*_*med 59

在数组中查找元素索引的最简单,最简单的方法.

ES5语法: [{id:1},{id:2},{id:3},{id:4}].findIndex(function(obj){return obj.id == 3})

ES6语法: [{id:1},{id:2},{id:3},{id:4}].findIndex(obj => obj.id == 3)

  • 我相信这是最优雅的解决方案.对于那些担心向后兼容性的人,你可以在https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex找到`findIndex`的polyfill. (3认同)
  • 我在ES6皮棉工具中收到一条警告,即此处使用的obj.id == 3运算符会导致意外的类型转换,因此请改用obj.id === 3运算符进行测试,以测试是否具有相等的值和类型。 (2认同)
  • 这个答案比上面接受的答案至少快 3.5 倍。使用 `var elementPos = array.map(function(x) {return x.id; }).indexOf(idYourAreLookingFor);` 需要 0.03500000002532033 毫秒 使用 `[{id:1},{id:2},{id: 3},{id:4}].findIndex(obj =&gt; obj.id == 3)` 花费了 0.00999999747378752 毫秒。 (2认同)
  • 这个答案是最有效的,因为它不会迭代整个数组。所选答案将映射完整数组,然后 findIndex 必然会迭代整个数组一次 (2认同)
  • 这是获取 **INDEX** `const index = this.pages.findIndex(object =&gt; { return object.id === id; }); 的正确方法 console.log('索引', 索引);` (2认同)

jba*_*bey 26

新的Array方法.filter()适用于此:

var filteredArray = array.filter(function (element) { 
    return element.id === 0;
});
Run Code Online (Sandbox Code Playgroud)

jQuery也可以用.grep()做到这一点

编辑:值得一提的是这两个函数都只是在引擎盖下迭代,它们之间不会有明显的性能差异并且滚动你自己的滤镜功能,但为什么要重新发明轮子.

  • 这不会返回索引. (58认同)

Nin*_*olz 8

array.forEach(function (elem, i) {  // iterate over all elements of array
    indexes[elem.id] = i;           // take the found id as index for the
});                                 // indexes array and assign i
Run Code Online (Sandbox Code Playgroud)

结果是id的查找列表.使用给定的id,我们得到记录的索引.


Ell*_*lle 6

var indices = [];
var IDs = [0, 1, 2, 3, 4];

for(var i = 0, len = array.length; i < len; i++) {
    for(var j = 0; j < IDs.length; j++) {
        if(array[i].id == ID) indices.push(i);
    }
}
Run Code Online (Sandbox Code Playgroud)


ena*_*upe 6

由于使用常规数组没有答案find:

var one = {id: 1, name: 'one'};
var two = {id: 2, name:'two'}
var arr = [one, two] 

var found = arr.find((a) => a.id === 2)

found === two // true

arr.indexOf(found) // 1
Run Code Online (Sandbox Code Playgroud)


小智 6

const index = array.findIndex(item => item.id === 'your-id');

这应该为您提供 id === your-id 数组中项目的索引

array = [ {id:1}, {id:2} ];

const index = array.findIndex(item => item.id === 2);

console.log(index);
Run Code Online (Sandbox Code Playgroud)


Sil*_*611 5

使用 ES6 的新方法

let picked_element = array.filter(element => element.id === 0);
Run Code Online (Sandbox Code Playgroud)


Pir*_*App 5

如果您关心性能,请不要使用查找过滤映射或上面讨论的任何方法

这是演示最快方法的示例。这里是实际测试的链接

设置块

var items = []

for(var i = 0; i < 1000; i++) {
    items.push({id: i + 1})
}

var find = 523
Run Code Online (Sandbox Code Playgroud)

最快的方法

var index = -1
for(var i = 0; i < items.length; i++) {
    if(items[i].id === find) {
        index = i;
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

较慢的方法

items.findIndex(item => item.id === find)
Run Code Online (Sandbox Code Playgroud)

最慢的方法

items.map(item => item.id).indexOf(find);
Run Code Online (Sandbox Code Playgroud)

  • 感谢您提供此比较!非常有趣的是性能有多少变化 - 包括哪种方法更快,具体取决于用于运行它们的浏览器/JavaScript 引擎。 (2认同)