对象数组中的 indexOf 方法?
2011-12-29
896461
如何简单直接地找到满足某些条件的对象数组中的索引?
例如,给定以下输入:
var hello = { hello: 'world', foo: 'bar'};
var qaz = { hello: 'stevie', foo: 'baz'}
var myArray = [];
myArray.push(hello, qaz);
如何搜索
myArray
以找到其
hello
属性等于
'stevie'
的元素的索引(在本例中,结果应为
1
)?
3个回答
我认为你可以使用 map 函数在一行中解决该问题:
const pos = myArray.map(e => e.hello).indexOf('stevie');
Pablo Francisco Pérez Hidalgo
2013-04-15
Array.prototype.findIndex 在除 IE(非 Edge)之外的所有浏览器中均受支持。但是提供的 polyfill 很不错。
var indexOfStevie = myArray.findIndex(i => i.hello === "stevie");
使用 map 的解决方案还可以。但是每次搜索时您都会遍历整个数组。这只是 findIndex 的最坏情况,一旦找到匹配项,它就会停止迭代。
var searchTerm = "stevie",
index = -1;
for(var i = 0, len = myArray.length; i < len; i++) {
if (myArray[i].hello === searchTerm) {
index = i;
break;
}
}
或作为函数:
function arrayObjectIndexOf(myArray, searchTerm, property) {
for(var i = 0, len = myArray.length; i < len; i++) {
if (myArray[i][property] === searchTerm) return i;
}
return -1;
}
arrayObjectIndexOf(arr, "stevie", "hello"); // 1
只是一些注意事项:
- 不要在数组上使用 for...in 循环
- 找到“针”后,请务必退出循环或返回函数
- 小心对象相等
例如,
var a = {obj: 0};
var b = [a];
b.indexOf({obj: 0}); // -1 not found
Joe
2011-12-29
在 ES2015 中,这非常容易:
myArray.map(x => x.hello).indexOf('stevie')
或者,对于更大的数组,可能具有更好的性能:
myArray.findIndex(x => x.hello === 'stevie')
Steve Bennett
2016-07-22