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

前端 未结 7 795
滥情空心
滥情空心 2021-02-14 07:45

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\'},
                      


        
相关标签:
7条回答
  • 2021-02-14 08:18

    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
    

    http://lodash.com/docs#findIndex

    Also, if you're bound to using Underscore - you can grab lodash's underscore build at https://raw.github.com/lodash/lodash/2.4.1/dist/lodash.underscore.js


    ES2015

    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 => i.id === 1); // 0
    
    0 讨论(0)
  • 2021-02-14 08:21

    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;
          return;
       }
    });
    
    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.

    0 讨论(0)
  • 2021-02-14 08:28
    _.find(array, function(item, index) {
      if (item.id == searchValue.id) {
        alert(index);
      }
    });
    
    0 讨论(0)
  • 2021-02-14 08:33

    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.

    0 讨论(0)
  • 2021-02-14 08:35

    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.

    0 讨论(0)
  • 2021-02-14 08:37

    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

    _.chain(array).pluck("key").indexOf("value").value();
    

    or

    _.map(array,function(e) { return e.key; }).indexOf(value);
    
    0 讨论(0)
提交回复
热议问题