Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

indexOf method in an object array?

Tags:

javascript

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.

like image 603
Antonio Laguna Avatar asked Dec 29 '11 12:12

Antonio Laguna


People also ask

Does indexOf work on array of objects?

The indexOf method returns the index of the first occurrence of a value in an array.

Can you use indexOf in arrays Java?

There is no direct indexOf function in java arrays.

How do you get the index of an element in a list in JS?

The indexOf() method returns the first index (position) of a specified value. The indexOf() method returns -1 if the value is not found. The indexOf() method starts at a specified index and searches from left to right. By default the search starts at the first element and ends at the last.


2 Answers

I think you can solve it in one line using the map function:

pos = myArray.map(function(e) { return e.hello; }).indexOf('stevie'); 
like image 149
Pablo Francisco Pérez Hidalgo Avatar answered Sep 20 '22 13:09

Pablo Francisco Pérez Hidalgo


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.


There's not really a concise way (when devs had to worry about IE8), but here's a common solution:
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:

  1. Don't use for...in loops on arrays
  2. Be sure to break out of the loop or return out of the function once you've found your "needle"
  3. Be careful with object equality

For example,

var a = {obj: 0}; var b = [a]; b.indexOf({obj: 0}); // -1 not found 
like image 44
Joe Avatar answered Sep 20 '22 13:09

Joe