在underscore.js / lodash.js中,如何使用`uniq`删除重复的元组?

时间:2015-05-19 12:52:09

标签: javascript underscore.js lodash

这是表达式

_([1,2],[1,3],[1,2]).uniq().value()

评估值为

[[1,2],[1,3],[1,2]]

虽然我期望的是[[1,2],[1,3]] ..

有没有人有这方面的想法?

2 个答案:

答案 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()比较比较复杂值可能会导致不一致。但是,大部分时间都足够了 - 如果最终出现意外结果,请使用此方法。