我怎样才能简单直接地找到满足某些条件的对象数组中的索引?
例如,给定这个输入:
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)?
当前回答
然而,大多数其他答案都是有效的。有时候,最好在你要使用它的地方创建一个简短的函数。
// indexOf wrapper for the list of objects
function indexOfbyKey(obj_list, key, value) {
for (index in obj_list) {
if (obj_list[index][key] === value) return index;
}
return -1;
}
// Find the string in the list (default -1)
var test1 = indexOfbyKey(object_list, 'name', 'Stevie');
var test2 = indexOfbyKey(object_list, 'last_name', 'some other name');
这取决于什么对你来说是重要的。使用一行代码可能会节省代码行数,或者将一个通用的解决方案放在覆盖各种边缘情况的某个地方是非常聪明的。但有时最好直接说:“这里我是这样做的”,而不是让未来的开发人员做额外的逆向工程工作。特别是如果你认为自己是“新手”,就像你的问题一样。
其他回答
你可以使用findIndex()方法:
cosnt myIndex=myArray.findIndex(el=>el.hello==='stevie')
如果myIndex < 0表示不存在
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
对于@Monika Garg的回答,您可以使用findIndex()(对于不受支持的浏览器,有一个polyfill)。
我看到人们对这个答案投了反对票,我希望他们这么做是因为语法错误,因为在我看来,这是最优雅的方式。
如果数组中的元素满足提供的测试函数,则findIndex()方法返回数组中的索引。否则返回-1。
例如:
Var hello = { 你好:“世界”, 喷火:“酒吧” }; Var qaz = { 你好:史蒂夫, 喷火:“记者” } var myArray = []; myArray.push(你好,qaz); var index = myArray.findIndex(函数(元素){ 返回元素。Hello == '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");
我更喜欢使用findIndex()方法:
var index = myArray.findIndex('hello','stevie');
Index会给出索引号。