Underscore.js如何在对象数组中查找唯一值?返回唯一项及其数量。

28

我正在使用_underscore.js来查找数组中的所有唯一项,但是我无法弄清楚如何同时获取返回的唯一项数量。

_PERSONARRAY = [{name:"tom",age:7}{name:"john",age:9}{name:"becky",age:2}{name:"sam",age:7}]

_UNIQUEAGEARRAY = _.chain(_PERSONARRAY).map(function(person) { return person.age }).uniq().value();

在这种情况下,_UNIQUEAGEARRAY 将等于:

[7,9,2]

我实际需要返回的是类似这样的东西:

[{uniqueAge:7,numberOfPeople:2}{uniqueAge:9,numberOfPeople:1}{uniqueAge:2,numberOfPeople:1}]

谢谢您的帮助。此外,我假设_underscore.js在执行这个任务时非常快吗?如果它速度太慢,请告诉我,因为我也愿意考虑其他解决方案。

4个回答

82

一个好的解决方案是使用可选的迭代器函数到underscore的uniq函数中:

let people = [
  {name: "Alice", age: 21}, 
  {name: "Bob", age: 34},
  {name: "Caroline", age: 21}
];
_.uniq(people, person => person.age);

文档:http://underscorejs.org/#uniq


17

我认为您正在寻找 countBy 函数:

_UNIQUEAGEARRAY = _.countBy(_PERSONARRAY, "age");

它产生的结果为:

{"2":1,"7":2,"9":1}

JSFiddle演示:http://jsfiddle.net/4J2SX/


5
你可以简单地使用 map 函数对其进行处理,以得到你所需的对象结构(更新在http://jsfiddle.net/4J2SX/2/)。 - Amitay Dobo
@howard 假设我有这样一个对象数组:[{couponid: 500 locationid: 10 },{couponid: 600 locationid: 15 }, { couponid: 500 locationid: 10 }, { couponid: 500 locationid: 20 } ]。使用您提供的解决方案,我得到了一个唯一优惠券ID的数组,并计算了每个唯一优惠券ID的数量;这是我在大量搜索后找到的最简洁的答案。请问,现在我该如何获取每个唯一优惠券ID的唯一位置ID数量?即在上面的couponid 500将有2个,couponid 600将有1个。我应该发布这个问题吗? - Bhargava

1

如果你想要使用underscore的groupBy(对于大型数据集可能不是一个好主意,因为它会保留所有分组项目的列表),你可以这样做:

示例:

var d = _.groupBy(_PERSONARRAY, function(p){ 
    return p.age;
});

如果您想将此映射到您的确切格式,请在groupBy之后进行映射:
var x = _.map(d, function(people, age) {   
    return {uniqueAge: age,  numberOfPeople: people.length};   
});

jsFiddle: http://jsfiddle.net/jsgkC/2/

该文本为英语,意思是保留了HTML代码的一个编程相关内容,并提供了一个jsFiddle链接。

注意:groupBy、countBy和indexBy都在内部使用相同的"group"函数,因此从性能的角度来看,我不知道哪一个更好。您可以在此处查看注释源代码:http://underscorejs.org/docs/underscore.html - Craig MacGregor

0

groupBy 函数很有用。

_personsList = [{name:"anjo",age:5},{name:"george",age:3},{name:"jack",age:5}];
_uniqAgeList = _.groupBy(_personsList, "age");

将会产生输出

{
    "3":[{"name":"george","age":3}],
    "5":[{"name":"anjo","age":5},{"name":"jack","age":5}]
}

JSFiddle: http://jsfiddle.net/4J2SX/199/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接