web-dev-qa-db-fra.com

Underscore.js trouve des valeurs uniques dans un tableau d'objets; Renvoyer des articles uniques et leur nombre

J'utilise _underscore.js pour trouver tous les éléments uniques dans un tableau, mais je ne sais pas comment obtenir également le nombre d'éléments uniques retournés.

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

Dans ce cas, _UNIQUEAGEARRAY sera égal à:

[7,9,2]

Ce dont j'ai réellement besoin est quelque chose comme:

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

Merci pour l'aide. Aussi, je suppose que _underscore.js est rapide à faire cela ?? Si c'est stupide et lent, dites-le-moi, car je serais ouvert à d'autres solutions.

25
That1guyoverthr

Je pense que vous recherchez la fonction countBy:

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

Il produit le résultat:

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

Démo JSFiddle: http://jsfiddle.net/4J2SX/

16
howrad

Une bonne solution consiste à utiliser la fonction d'itérateur facultative pour souligner la fonction uniq:

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

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

76
jakecraige

Vous pouvez utiliser le groupe de soulignement si vous le souhaitez (ce n'est peut-être pas une bonne idée pour un grand ensemble de données car il conserve une liste de tous les éléments groupés)

Exemple:

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

Si vous voulez mapper cela à votre format exact, essayez de faire une carte après le groupe

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

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

1
Craig MacGregor

La fonction groupBy est utile.

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

produira une sortie

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

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

0
Amil Sajeev