indexOf method in an object array?
What's the best method to get the index of an array which contains objects?
Imagine this scenario:
var hello = {
hello: 'world',
foo: 'bar'
};
var qaz = {
hello: 'stevie',
foo: 'baz'
}
var myArray = [];
myArray.push(hello,qaz);
Now I would like to have the indexOf
the object which hello
property is 'stevie'
which, in this example, would be 1
.
I'm pretty newbie with JavaScript and I don't know if there is a simple method or if I should build my own function to do that.
I think you can solve it in one line using the map function:
pos = myArray.map(function(e) { return e.hello; }).indexOf('stevie');
Array.prototype.findIndex is supported in all browsers other than IE (non-edge). But the polyfill provided is nice.
var indexOfStevie = myArray.findIndex(i => i.hello === "stevie");
The solution with map is okay. But you are iterating over the entire array every search. That is only the worst case for findIndex which stops iterating once a match is found.
var searchTerm = "stevie",
index = -1;
for(var i = 0, len = myArray.length; i < len; i++) {
if (myArray[i].hello === searchTerm) {
index = i;
break;
}
}
or as a function:
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
Just some notes:
- Don't use for...in loops on arrays
- Be sure to break out of the loop or return out of the function once you've found your "needle"
- Be careful with object equality
For example,
var a = {obj: 0};
var b = [a];
b.indexOf({obj: 0}); // -1 not found