我怎样才能简单直接地找到满足某些条件的对象数组中的索引?
例如,给定这个输入:
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)?
当前回答
请看这个例子:http://jsfiddle.net/89C54/
for (i = 0; i < myArray.length; i++) {
if (myArray[i].hello === 'stevie') {
alert('position: ' + i);
return;
}
}
它从零开始计数。
其他回答
在ES2015中,这很简单:
myArray.map(x => x.hello).indexOf('stevie')
或者,更大的数组可能会有更好的性能:
myArray.findIndex(x => x.hello === 'stevie')
Array.prototype.findIndex在除IE(非边缘)之外的所有浏览器中都支持。但是提供的填充材料很好。
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
只是一些注释:
不要用于…在数组的循环中 一旦找到“指针”,请确保跳出循环或返回函数。 注意对象相等性
例如,
var a = {obj: 0};
var b = [a];
b.indexOf({obj: 0}); // -1 not found
如果你的对象与你在数组中使用的对象是同一个对象,你应该能够以同样的方式获取对象的索引,就像它是一个字符串一样。
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
这无需自定义代码即可实现
var arr, a, found;
arr = [{x: 1, y: 2}];
a = {x: 1, y: 2};
found = JSON.stringify(arr).indexOf(JSON.stringify(a)) > - 1;
// found === true
注意:这并没有给出实际的索引,它只告诉你的对象是否存在于当前的数据结构中
你可以简单地使用
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,只有一个略读。