索引对象数组中的方法?

2022-08-29 22:35:53

获取包含对象的数组的索引的最佳方法是什么?

想象一下这个场景:

var hello = {
    hello: 'world',
    foo: 'bar'
};
var qaz = {
    hello: 'stevie',
    foo: 'baz'
}

var myArray = [];
myArray.push(hello,qaz);

现在,我希望在此示例中,哪个属性是的对象。indexOfhello'stevie'1

我是JavaScript的新手,我不知道是否有一个简单的方法,或者我是否应该构建自己的函数来做到这一点。


答案 1

我认为您可以使用map函数在一行中解决它:

pos = myArray.map(function(e) { return e.hello; }).indexOf('stevie');

答案 2

Array.prototype.findIndex 在除 IE(非边缘)以外的所有浏览器中都受支持。但提供的polyfill很好。

var indexOfStevie = myArray.findIndex(i => i.hello === "stevie");

带地图的解决方案是可以的。但是,您每次搜索都会迭代整个数组。这只是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. 不要用于...在数组上的循环中
  2. 一旦找到“针”,请务必打破循环或返回函数
  3. 注意对象相等性

例如

var a = {obj: 0};
var b = [a];
b.indexOf({obj: 0}); // -1 not found