2013-10-09 7 views
23

Sto usando _underscore.js per trovare tutti gli oggetti unici in un array, ma non riesco a capire come ottenere anche il numero di oggetti unici restituiti.Underscore.js trova valori univoci nella matrice di oggetti; Restituisci gli articoli unici e il loro conteggio

_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 questo caso _UNIQUEAGEARRAY sarà uguale:

[7,9,2] 

Quello che ho veramente bisogno tornato è qualcosa di simile:

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

Grazie per l'aiuto. Inoltre, sto assumendo che _underscore.js sia veloce nel farlo ?? Se è stupido, dimmi perché sarei aperto ad altre soluzioni.

risposta

17

penso che stai cercando per la funzione countBy:

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

Produce il risultato:

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

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

+5

Poi si può semplicemente eseguire attraverso mappa per ottenerlo nella struttura oggetto che si voleva (aggiornati alle http://jsfiddle.net/4J2SX/2 /) –

+0

Così semplice! Grazie ragazzi! – That1guyoverthr

+0

@howard supponiamo che abbia questa matrice di oggetti: [{couponid: 500 locationid: 10}, {couponid: 600 locationid: 15}, {couponid: 500 locationid: 10}, {couponid: 500 locationid: 20}] Utilizzo del soluzione da voi fornita, ho ottenuto una serie di ID coupon univoci, con conteggi per ogni ID coupon univoco; è stata l'ansa più concisa che ho trovato dopo un sacco di ricerche, per favore puoi dirlo, ora come posso ottenere, per ogni couponid unico, quanti identificatori di posizione unici? cioè nel couponid di cui sopra 500 avrebbe 2, e couponid 600 avrebbe 1. Devo postare questo come una domanda separata? – Bhargava

1

È possibile utilizzare groupBy di sottolineatura, se si desidera (potrebbe non essere una buona idea per un set di dati di grandi dimensioni dal momento che mantiene un elenco di tutti gli elementi raggruppati)

Esempio:

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

Se si desidera mappare questo al vostro formato esatto provare a fare una mappa dopo il groupBy:

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

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

+0

Nota: groupBy, countBy, index, utilizzano tutti la stessa funzione di "gruppo" internamente, quindi non so se uno è molto meglio dell'altro dal punto di vista delle prestazioni. Puoi vedere la fonte annotata qui: http://underscorejs.org/docs/underscore.html –

67

Una bella soluzione è quella di utilizzare il funzione iteratore opzionale alla funzione di sottolineatura uniq

_.uniq(personArray, function(person) { return person.age; }); 

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

+1

sì, molto più pulito per farlo – 29er

0

groupBy funzione è utile.

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

produrrà uscita

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

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