简体   繁体   中英

Underscore.js find unique values in array of objects; Return unique items and their count

I am using _underscore.js to find all unique items in an array, but I can't figure out how to also get the number of unique items returned.

_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();

In this case _UNIQUEAGEARRAY will equal:

[7,9,2]

What I actually need returned is something like:

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

Thanks for help. Also, I'm assuming _underscore.js is quick at doing this?? If it's stupid slow tell me cause I'd be open to other solutions.

A nice solution is to use the optional iterator function to underscore's uniq function:

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

Docs: http://underscorejs.org/#uniq

I think you're looking for the countBy function:

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

It produces the result:

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

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

You can use underscore's groupBy if you want (might not be a good idea for a large dataset since it keeps a list of all the grouped items)

Example:

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

If you want to map this to your exact format try doing a map after the groupBy:

var x = _.map(d, function(people, age) {   
    return {uniqueAge: age,  numberOfPeople: people.length};   
});

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

groupBy function is useful.

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

will produce output

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM