我怎样才能简单直接地找到满足某些条件的对象数组中的索引?

例如,给定这个输入:

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

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

我如何搜索myArray找到其hello属性等于'stevie'的元素的索引(在这种情况下,结果应该是1)?


当前回答

你可以简单地使用

const someId = 2; Const数组= [{id:1}, {id:2}, {id:3}]; 常量索引=数组。Reduce ((i, item, index) => item。id === someId ?索引:i, -1); alert('someId ' + someId + ' is at index ' + index);

没有下划线,没有for,只有一个略读。

其他回答

或者创建原型:

Array.prototype.indexOfObject = function arrayObjectIndexOf(property, value) {
    for (var i = 0, len = this.length; i < len; i++) {
        if (this[i][property] === value) return i;
    }
    return -1;
}

myArr.indexOfObject("name", "stevie");

如果你的对象与你在数组中使用的对象是同一个对象,你应该能够以同样的方式获取对象的索引,就像它是一个字符串一样。

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

var qazCLONE = { // new object instance and same structure
    hello: 'stevie',
    foo: 'baz'
}

var myArray = [hello,qaz];

myArray.indexOf(qaz) // should return 1
myArray.indexOf(qazCLONE) // should return -1

我喜欢Pablo的回答,但是array# indexOf和array# map并不适用于所有浏览器。下划线将使用本机代码,如果它是可用的,但也有回退。另外,它有pluck方法来做Pablo的匿名映射方法所做的事情。

var idx = _.chain(myArray).pluck("hello").indexOf("Stevie").value();

如果你只是对这个职位感兴趣,请参阅@Pablo的答案。

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

然而,如果你希望找到元素(例如,如果你正在考虑做这样的myArray[pos]),有一个更有效的单行方法来做,使用过滤器。

element = myArray.filter((e) => e.hello === 'stevie')[0];

参见性能结果(~ +42% ops/sec): http://jsbench.github.io/#7fa01f89a5dc5cc3bee79abfde80cdb3

你可以创建自己的原型来做到这一点:

喜欢的东西:

Array.prototype.indexOfObject = function (object) {
    for (var i = 0; i < this.length; i++) {
        if (JSON.stringify(this[i]) === JSON.stringify(object))
            return i;
    }
}