这是表达式
_([1,2],[1,3],[1,2]).uniq().value()
评估值为
[[1,2],[1,3],[1,2]]
虽然我期望的是[[1,2],[1,3]]
..
有没有人有这方面的想法?
答案 0 :(得分:2)
Underscore在列表中使用严格的相等性。因此,在您的示例中,下划线将通过比较2个数组来检查结果数组中的值。 [1,2] === [1,2]
永远是假的,因为它们是两个不同的数组。
一个快速的' n'肮脏的解决方案是:
var result = _.uniq(data, function (a) {
return a.join(',');
});
答案 1 :(得分:1)
如果你想使用isEqual()比较唯一性,这是一种相当通用的方法,我会做这样的事情:
_.reduce(coll, function(result, item) {
if (!_.any(result, _.ary(_.partial(_.isEqual, item), 1))) {
result.push(item);
}
return result;
}, []);
使用reduce(),您可以从一个空数组开始。然后any()会告诉您当前项目是否已在results
数组中。如果没有,它会添加它。
使用toString()
比较比较复杂值可能会导致不一致。但是,大部分时间都足够了 - 如果最终出现意外结果,请使用此方法。