How can I find the index of an object inside a Array using underscore.js?

All we need is an easy explanation of the problem, so here it is.

I want to get the index of the given value inside a Array using underscore.js.

Here is my case

var array = [{'id': 1, 'name': 'xxx'},
             {'id': 2, 'name': 'yyy'},
             {'id': 3, 'name': 'zzz'}];

var searchValue = {'id': 1, 'name': 'xxx'};

I used the following code,

var index = _.indexOf(array, function(data) { 
                alert(data.toSource()); //For testing purpose 
                return data === searchValue; 

Also tried this too

var index = _.indexOf(array, {id:});

But it returns -1 . Since it does not enter into that function. So I didn’t get that alert message.

Whats wrong with my code.
Can anyone help me?

How to solve :

I know you bored from this bug, So we are here to help you! Take a deep breath and look at the explanation of your problem. We have many solutions to this problem, But we recommend you to use the first method because it is tested & true method that will 100% work for you.

Method 1

I’d strongly suggest taking a look at lodash. It contains quite a bit of nifty little functions that unfortunately underscore is lacking.

For example, this is what you would do with lodash:

var array = [{'id': 1, 'name': 'xxx'},
           {'id': 2, 'name': 'yyy'},
           {'id': 3, 'name': 'zzz'}];

var searchValue = {'id': 1, 'name': 'xxx'};

var index = _.findIndex(array, searchValue); 
console.log(index === 0); //-> true

Also, if you’re bound to using Underscore – you can grab lodash’s underscore build at


With ES2015 now in wide use (through transpilers like Babel), you could forego lodash and underscore for the task at hand and use native methods:

var arr = [{ id: 1 }, { id: 2}];

arr.findIndex(i => === 1); // 0

Method 2

Use this instead:

var array = [{'id': 1, 'name': 'xxx'},
             {'id': 2, 'name': 'yyy'},
             {'id': 3, 'name': 'zzz'}];

var searchValue = {'id': 1, 'name': 'xxx'},
    index = -1;

_.each(array, function(data, idx) { 
   if (_.isEqual(data, searchValue)) {
      index = idx;

console.log(index); //0

In your snippet data === searchValue compares the objects’ references, you don’t want to do this. On the other hand, if you use data == searchValue you are going to compare objects’ string representations i.e. [Object object] if you don’t have redefined toString methods.

So the correct way to compare the objects is to use _.isEqual.

Method 3

May be my suggestion will give you advice.

Why do you use callback for indexof method? The signature of indexof in underscore.js is the following:

_.indexOf(array, value, [isSorted]) 

find could be better for this task:

_.find(array, function(item, index) {
  if ( == {

Method 4

With objects, === and == check to see if two references refer to the same object; it doesn’t check for equivalent objects:

var a = {foo: "bar"};
var b = {foo: "bar"};
console.log(a === b); // false, `a` and `b` refer to different (but equivalent) objects
a = b = {something: "here"};
console.log(a === b); // true, `a` and `b` refer to the *same* object

You have to test the object’s properties to make the decision. In your case, the id property looks like a good option, or if you want to compare all of the properties, you might use Underscore’s isEqual.

Method 5

Underscore uses native indexOf method if available,else applies fallback. Thus, for a list of objects you have to implement it in some other way.

One example could be


or,function(e) { return e.key; }).indexOf(value);

Method 6

In case you have complicated objects, and want to search one object in the collection looking for a certain property, just go with:

 _.indexOf(arrayObj, _.findWhere(arrayObj, {id: 1})  );

Where “arrayObj” is the collection with objects, “id” is the prop, and “1” is the value being in search.

Method 7

i am using find index

 _.findIndex(array, searchValue); 

Method 8

_.find(array, function(item, index) {
  if ( == {

Note: Use and implement method 1 because this method fully tested our system.
Thank you 🙂

All methods was sourced from or, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply