20

我已经查看了这个 Stack 问题,“Removing duplicate objects with Underscore for Javascript”,这正是我想要做的,但没有一个例子有效。事实上,我无法让任何迭代器函数与 _.uniq 一起使用。

_.uniq([1, 2, 1, 3, 1, 4]);
> [1, 2, 3, 4]
_.uniq([1, 2, 1, 3, 1, 4], false, function(a){ return a===4;});
> [1, 2, 3, 4]
_.uniq([1, 2, 1, 3, 1, 4], true, function(a){ return a===4;});
> [1, 2, 1, 3, 1, 4]
_.uniq([1, 2, 1, 3, 1, 4], false, function(a){ return false;});
> [1, 2, 3, 4]
_.uniq([1, 2, 1, 3, 1, 4], false, function(a){ return true;});
> [1, 2, 3, 4]

var people = [ { name: 'John', age: 20 }, { name: 'Mary', age: 31 }, { name: 'Kevin', age: 20 }]; 
_.uniq(people, false, function(p){ return p.age; });

> [ { age: 20, name: "John" }, 
    { age: 31, name: "Mary" },
    { age: 20, name: "Kevin" } ]

我会做:

_.uniq(_.map(people, function(p){ return p.age; }));
> [20, 31]

但它只返回映射值,而不是原始对象。

任何帮助表示赞赏。我正在使用下划线版本 1.1.7

4

2 回答 2

23

我有同样的问题。这是因为 _.uniq()返回一个新的缩减数组,所以你必须将它分配给一个变量。因此,通过这个小小的修正,它必须起作用。

var people = [ { name: 'John', age: 20 }, { name: 'Mary', age: 31 }, { name: 'Kevin', age: 20 }];

people = _.uniq(people, false, function(p){ return p.age; });

[ {年龄:20,姓名:“约翰”},{年龄:31,姓名:“玛丽”}]

于 2014-07-18T07:20:38.553 回答
15

看起来 _.uniq 的比较函数是在 1.2.0 中引入的

来自变更日志

_.uniq 现在可以传递一个可选的迭代器,以确定对象应该被认为是唯一的标准。

于 2012-10-23T16:42:50.787 回答