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

Posted

技术标签:

【中文标题】如何使用 underscore.js 在 Array 中找到对象的索引?【英文标题】:How can I find the index of an object inside a Array using underscore.js? 【发布时间】:2014-02-26 15:23:55 【问题描述】:

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

这是我的情况

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

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

我使用了以下代码,

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

这个也试过了

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

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

我的代码有什么问题。 谁能帮我?

【问题讨论】:

【参考方案1】:

对于对象,===== 检查两个引用是否引用了 相同 对象;它不检查 等效 对象:

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

您必须测试对象的属性才能做出决定。在您的情况下,id 属性看起来是一个不错的选择,或者如果您想比较所有属性,您可以使用 Underscore 的 isEqual

【讨论】:

【参考方案2】:

改用这个:

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

在您的 sn-p data === searchValue 比较对象的引用时,您不想这样做。另一方面,如果您使用data == searchValue,您将比较对象的字符串表示,即[Object object],如果您没有重新定义toString 方法。

所以比较对象的正确方法是使用_.isEqual

【讨论】:

@T.J.Crowder 是的,同意。修正了我的答案。 您可能想查看isEqual 的使用方式。 :-)【参考方案3】:

也许我的建议会给你建议。

为什么你在 indexof 方法中使用回调? underscore.js中indexof的签名如下:

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

find 可能更适合这项任务:

_.find(array, function(item, index) 
  if (item.id == searchValue.id) 
    alert(index);
  
);

【讨论】:

有趣。那里缺少下划线的文档,因为它们没有解释谓词的参数是什么(它们只显示带有值的示例)。【参考方案4】:

如果可用,下划线使用本机 indexOf 方法,否则应用回退。因此,对于对象列表,您必须以其他方式实现它。

一个例子可以是

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

_.map(array,function(e)  return e.key; ).indexOf(value);

【讨论】:

【参考方案5】:

我强烈建议看看 lodash。它包含很多漂亮的小功能,不幸的是缺少下划线。

例如,这就是你对 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

此外,如果您一定要使用 Underscore - 您可以在 https://raw.github.com/lodash/lodash/2.4.1/dist/lodash.underscore.js 获取 lodash 的下划线版本


ES2015

随着 ES2015 现在被广泛使用(通过像 Babel 这样的编译器),你可以放弃 lodash 和 underscore 来处理手头的任务并使用本地方法:

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

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

【讨论】:

【参考方案6】:
_.find(array, function(item, index) 
  if (item.id == searchValue.id) 
    alert(index);
  
);

【讨论】:

【参考方案7】:

如果您有复杂的对象,并且想在集合中搜索一个对象以查找某个属性,请使用:

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

其中“arrayObj”是包含对象的集合,“id”是道具,“1”是正在搜索的值。

【讨论】:

【参考方案8】:

我正在使用查找索引

 _.findIndex(array, searchValue); 

【讨论】:

以上是关于如何使用 underscore.js 在 Array 中找到对象的索引?的主要内容,如果未能解决你的问题,请参考以下文章

underscore.js 预编译模板使用

如何使用underscore.js在列表元素中过滤具有匹配参数的对象?

Underscore.js:使用在对象中找到的键从对象列表中创建映射

Underscore.js-精巧而强大实用功能库

Underscore.js基础入门

使用 underscore.js 从对象/数组中仅检索一个字段