我怎样才能简单直接地找到满足某些条件的对象数组中的索引?
例如,给定这个输入:
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)?
当前回答
使用_。从underscore.js库中找到findIndex
下面是例子 _。findIndex ([{: 1}, {2, c: 10}, {: 3}), {: 2, c: 10}) / / 1
其他回答
我在这里对各种答案做了一些性能测试,任何人都可以自己运行:
https://jsperf.com/find-index-of-object-in-array-by-contents
根据我在Chrome中的初始测试,以下方法(使用原型内部设置的for循环)是最快的:
Array.prototype.indexOfObject = function (property, value) {
for (var i = 0, len = this.length; i < len; i++) {
if (this[i][property] === value) return i;
}
return -1;
}
myArray.indexOfObject("hello", "stevie");
这段代码是对Nathan Zaetta的答案稍加修改的版本。
在性能基准测试中,我尝试将目标放在1000对象数组的中间(索引500)和末尾(索引999),即使我将目标放在数组中的最后一项(意味着它必须循环遍历数组中的每一项才能找到),它仍然是最快的。
这个解决方案还有一个好处,就是对于重复执行来说是最简洁的,因为只需要重复最后一行:
myArray.indexOfObject("hello", "stevie");
你可以创建自己的原型来做到这一点:
喜欢的东西:
Array.prototype.indexOfObject = function (object) {
for (var i = 0; i < this.length; i++) {
if (JSON.stringify(this[i]) === JSON.stringify(object))
return i;
}
}
我认为你可以用map函数在一行中解决它:
const pos = myArray.map(e => e.hello).indexOf('stevie');
或者创建原型:
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");
对于@Monika Garg的回答,您可以使用findIndex()(对于不受支持的浏览器,有一个polyfill)。
我看到人们对这个答案投了反对票,我希望他们这么做是因为语法错误,因为在我看来,这是最优雅的方式。
如果数组中的元素满足提供的测试函数,则findIndex()方法返回数组中的索引。否则返回-1。
例如:
Var hello = { 你好:“世界”, 喷火:“酒吧” }; Var qaz = { 你好:史蒂夫, 喷火:“记者” } var myArray = []; myArray.push(你好,qaz); var index = myArray.findIndex(函数(元素){ 返回元素。Hello == 'stevie'; }); 警报(指数);