如何使用 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在列表元素中过滤具有匹配参数的对象?