【问题标题】:Using an iterator function in Underscore's _.uniq在 Underscore 的 _.uniq 中使用迭代器函数
【发布时间】:2014-07-18 15:20:38
【问题描述】:

我看过这个 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

【问题讨论】:

  • 您展示的示例对我来说效果很好(当我在下划线页面的控制台中尝试它们时) - 以及 this fiddle 也是如此。顺便说一句,1.1.7 已经很老了;不是这个原因吗?

标签: javascript underscore.js


【解决方案1】:

我遇到了同样的问题。这是因为 _.uniq() returns 一个新的简化数组,因此您必须将其分配给一个变量。因此,通过这个小小的修正,它必须起作用。

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,姓名:“玛丽”}]

【讨论】:

    【解决方案2】:

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

    来自changelog

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

    【讨论】:

    • 啊!这就解释了一切。 )
    • 嘿!是的,我有一段时间很困惑 - @BishopZ 提到了这个版本!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    • 2014-09-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    相关资源
    最近更新 更多