2012-09-07 16 views
6

Usando jQuery, ¿cómo puedo iterar sobre un objeto y obtener los valores únicos de una clave con un recuento de cada valor?JavaScript: ¿Obtiene valores únicos y sus recuentos de una matriz de objetos?

Por ejemplo, para esta matriz:

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 }, 
]; 

me gustaría volver el siguiente:

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

Tengo esto, que funciona, pero es un poco torpe:

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

probar este http://stackoverflow.com/questions/1960473/unique-values-in-an-array –

+2

@Artem - Eso es totalmente una pregunta diferente sobre cómo obtener una matriz de valores únicos – Richard

+0

¿La matriz inicial siempre se ordenará tal como está? – sp00m

Respuesta

7

podría utilizar map para este propósito como:

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; 
}); 

también puede señalo a usted que a pesar de este código agradable a la vista y compacto, esto no es generalmente más rápido. Mejor que el código sea más rápido y más fácil mirar como:

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

No necesita '$ .map' aquí, usaría' $ .each' en su lugar. –

+0

@Rocket, utilicé '$ .map' coz, eso fue lo primero que se me vino a la mente en ese momento, aunque en este contexto particular, ambos tendrían el propósito de eliminar la torpeza. También he puesto el código para el mismo. –

+0

Gracias! No había visto ese uso de '||' antes, muy útil. – Richard

Cuestiones relacionadas