51 votos

Recuento de ocurrencias de los elementos de la matriz de Javascript

En Javascript, estoy tratando de tomar un Array inicial de valores numéricos y contar los elementos dentro de él. Idealmente, el resultado sería dos nuevos arrays, el primero especificando cada elemento único, y el segundo conteniendo el número de veces que cada elemento ocurre. Sin embargo, estoy abierto a sugerencias sobre el formato de la salida.

Por ejemplo, si el Array inicial era:

5, 5, 5, 2, 2, 2, 2, 2, 9, 4

Entonces se crearían dos nuevas matrices. El primero contendría el nombre de cada elemento único:

5, 2, 9, 4

La segunda contendría el número de veces que ese elemento aparece en la matriz inicial:

3, 5, 1, 1

Porque el número 5 aparece tres veces en la matriz inicial, el número 2 aparece cinco veces y el 9 y el 4 aparecen una vez.

He buscado mucho una solución, pero nada parece funcionar, y todo lo que he intentado por mi cuenta ha terminado siendo ridículamente complejo. ¡Se agradece cualquier ayuda!

Gracias :)

54voto

typeof Puntos 2001

Puede utilizar un objeto para mantener los resultados:

var arr = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4];
var counts = {};

for(var i = 0; i< arr.length; i++) {
    var num = arr[i];
    counts[num] = counts[num] ? counts[num]+1 : 1;
}

Por lo tanto, ahora su objeto de recuento puede decirle cuál es el recuento de un número en particular:

console.log(counts[5]); // logs '3'

Si quieres obtener un Array de miembros, sólo tienes que utilizar el botón keys() funciones

keys(counts); // returns ["5", "2", "9", "4"]

35voto

Šime Vidas Puntos 59994

Aquí tienes:

function foo(arr) {
    var a = [], b = [], prev;

    arr.sort();
    for ( var i = 0; i < arr.length; i++ ) {
        if ( arr[i] !== prev ) {
            a.push(arr[i]);
            b.push(1);
        } else {
            b[b.length-1]++;
        }
        prev = arr[i];
    }

    return [a, b];
}

Demostración en vivo: http://jsfiddle.net/simevidas/bnACW/

28voto

adamse Puntos 4458
var a = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4].reduce(function (acc, curr) {
  if (typeof acc[curr] == 'undefined') {
    acc[curr] = 1;
  } else {
    acc[curr] += 1;
  }

  return acc;
}, {});

// a == {2: 5, 4: 1, 5: 3, 9: 1}

21voto

mu is too short Puntos 205090

No uses dos arrays para el resultado, usa un objeto:

a      = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4];
result = { };
for(i = 0; i < a.length; ++i) {
    if(!result[a[i]])
        result[a[i]] = 0;
    ++result[a[i]];
}

Entonces result se verá así:

{
    2: 5,
    4: 1,
    5: 3,
    9: 1
}

8voto

snrobot Puntos 331

Si utiliza el guión bajo, puede seguir la ruta funcional

a = ['foo', 'foo', 'bar'];

var results = _.reduce(a,function(counts,key){ counts[key]++; return counts },
                  _.object( _.map( _.uniq(a), function(key) { return [key, 0] })))

así que su primer Array es

_.keys(results)

y el segundo Array es

_.values(results)

la mayor parte de esto será por defecto las funciones nativas de javascript si están disponibles

demostración : http://jsfiddle.net/dAaUU/

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X