开发者问题收集

对象数组中的 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 的最坏情况,一旦找到匹配项,它就会停止迭代。


实际上没有简洁的方法 (当开发人员不得不担心 IE8 时) ,但这里有一个常见的解决方案:

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

只是一些注意事项:

  1. 不要在数组上使用 for...in 循环
  2. 找到“针”后,请务必退出循环或返回函数
  3. 小心对象相等

例如,

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