2012-09-07 11 views
6

Utilizzando jQuery, come posso scorrere su un oggetto e ottenere i valori univoci di una chiave con un conteggio di ciascun valore?JavaScript: ottieni valori univoci e i relativi conteggi da una serie di oggetti?

Ad esempio, per questa matrice:

var electrons = [ 
    { name: 'Electron1', distance: 1 }, 
    { name: 'Electron2', distance: 1 }, 
    { name: 'Electron3', distance: 2 }, 
    { name: 'Electron4', distance: 2 }, 
    { name: 'Electron5', distance: 2 }, 
    { name: 'Electron6', distance: 2 }, 
    { name: 'Electron7', distance: 2 }, 
    { name: 'Electron8', distance: 2 }, 
    { name: 'Electron9', distance: 2 }, 
    { name: 'Electron10', distance: 2 }, 
    { name: 'Electron11', distance: 3 }, 
]; 

mi piacerebbe tornare il seguente:

var distance_counts = {1: 2, 2: 8, 3: 1}; 

ho questo, che funziona, ma è un po 'impacciato:

var radius_counts = {}; 
for (var i = 0; i < electrons.length; i++) { 
    if (electrons[i].distance in radius_counts) { 
     radius_counts[electrons[i].distance] += 1; 
    } else { 
     radius_counts[electrons[i].distance] = 1; 
    } 
} 
+0

Prova questa http://stackoverflow.com/questions/1960473/unique-values-in-an-array –

+2

@Artem - Questo è un completamente domanda diversa su come ottenere una serie di valori unici. – Richard

+0

La matrice iniziale verrà sempre ordinata così com'è? – sp00m

risposta

7

si potrebbe usare map per questo scopo come:

var distances = {}; 
$.map(electrons,function(e,i) { 
    distances[e.distance] = (distances[e.distance] || 0) + 1; 
}); 

o

var distances = {}; 
$.each(electrons,function(i,e) { 
    distances[this.distance] = (distances[this.distance] || 0) + 1; 
}); 

anch'essi faccio notare che, anche se questo codice buono a guardare e compatto, questo non è generalmente più veloce. Meglio rendere il codice più veloce e più facile da guardare come:

var distances = {},e; 
for (var i = 0,l=electrons.length; i < l; i++) { 
    e = electrons[i]; 
    distances[e.distance] = (distances[e.distance] || 0) + 1; 
} 
+0

Qui non è necessario '$ .map', io invece userei' $ .each '. –

+0

@Rocket, ho usato '$ .map' coz, quella è stata la prima cosa che mi è venuta in mente in quel momento, anche se in questo particolare contesto entrambi sarebbero serviti allo scopo di rimuovere la goffaggine. Inoltre ho messo il codice per lo stesso. –

+0

Grazie! Non avevo mai visto quell'uso di '||' prima - molto utile. – Richard

Problemi correlati