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

In underscore.js/lodash.js, how to remove duplicate tuple using `uniq`?

这是表达式

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

评价值为

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

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

有人对此有想法吗?

如果您不提供谓词,Underscore 在列表中使用严格相等。因此,在您的示例中,下划线将通过比较 2 个数组来检查结果数组中是否有一个值,例如[1,2] === [1,2] 这将永远是错误的,因为它们是两个不同的数组。

一个快速 'n' 肮脏的解决方案是:

var result = _.uniq(data, function (a) {
    return a.join(',');
});

如果您想使用 isEqual() 比较唯一性,这是一种相当通用的方法,我会这样做:

_.reduce(coll, function(result, item) {
    if (!_.any(result, _.ary(_.partial(_.isEqual, item), 1))) {
        result.push(item);
    }
    return result;
}, []);

使用 reduce(), you start off with an empty array. Then any() 告诉您当前项目是否已经在 results 数组中。如果没有,它会添加它。

使用toString()比较复数值可能会导致不一致。但是,大多数时候它就足够了 - 如果您最终得到意想不到的结果,请使用此方法。