我怎样才能简单直接地找到满足某些条件的对象数组中的索引?
例如,给定这个输入:
var hello = {
hello: 'world',
foo: 'bar'
};
var qaz = {
hello: 'stevie',
foo: 'baz'
}
var myArray = [];
myArray.push(hello, qaz);
我如何搜索myArray找到其hello属性等于'stevie'的元素的索引(在这种情况下,结果应该是1)?
我怎样才能简单直接地找到满足某些条件的对象数组中的索引?
例如,给定这个输入:
var hello = {
hello: 'world',
foo: 'bar'
};
var qaz = {
hello: 'stevie',
foo: 'baz'
}
var myArray = [];
myArray.push(hello, qaz);
我如何搜索myArray找到其hello属性等于'stevie'的元素的索引(在这种情况下,结果应该是1)?
当前回答
这里的大多数答案并不能解决所有情况。 我发现这个解决方案更好:
const isInarray = myArr.filter((obj) => obj.hello === 'stevie' && obj.foo === 'baz').length > 0;
if (!isInArray) {
....
}
其他回答
我认为你可以用map函数在一行中解决它:
const pos = myArray.map(e => e.hello).indexOf('stevie');
如果你只是对这个职位感兴趣,请参阅@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
如果你的对象与你在数组中使用的对象是同一个对象,你应该能够以同样的方式获取对象的索引,就像它是一个字符串一样。
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
或者创建原型:
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");
在ES2015中,这很简单:
myArray.map(x => x.hello).indexOf('stevie')
或者,更大的数组可能会有更好的性能:
myArray.findIndex(x => x.hello === 'stevie')