如何使用underscore.js在Array中找到对象的索引?

pri*_*nce 10 javascript javascript-framework underscore.js angularjs

我想使用underscore.js获取Array中给定值的索引.

这是我的情况

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

var searchValue = {'id': 1, 'name': 'xxx'};
Run Code Online (Sandbox Code Playgroud)

我使用了以下代码,

var index = _.indexOf(array, function(data) { 
                alert(data.toSource()); //For testing purpose 
                return data === searchValue; 
            });
Run Code Online (Sandbox Code Playgroud)

也试过这个

var index = _.indexOf(array, {id: searchValue.id});
Run Code Online (Sandbox Code Playgroud)

但它returns -1.因为它没有进入该功能.所以我没有得到那个警报信息.

我的代码出了什么问题.谁能帮我?

Kas*_*wau 15

我强烈建议你看一下洛达什.它包含了相当多的漂亮的小功能,遗憾的是缺少这些功能.

例如,这就是你用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
Run Code Online (Sandbox Code Playgroud)

http://lodash.com/docs#findIndex

此外,如果您必须使用Underscore - 您可以访问https://raw.github.com/lodash/lodash/2.4.1/dist/lodash.underscore.js获取lodash的下划线构建


ES2015

随着ES2015的广泛使用(通过像Babel这样的转发器),您可以放弃lodash并强调手头的任务并使用本机方法:

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

arr.findIndex(i => i.id === 1); // 0
Run Code Online (Sandbox Code Playgroud)


Min*_*hev 14

请改用:

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
Run Code Online (Sandbox Code Playgroud)

在您的代码段中data === searchValue比较对象的引用,您不希望这样做.另一方面,如果您使用,data == searchValue您将比较对象的字符串表示,即[Object object]如果您没有重新定义的toString方法.

因此,比较对象的正确方法是使用_.isEqual.