Cómo contar valores duplicados en una matriz en javascript

Resuelto detno29 asked hace 11 años • 36 respuestas

Actualmente, tengo una matriz como esa:

var uniqueCount = Array();

Después de algunos pasos, mi matriz se ve así:

uniqueCount = [a,b,c,d,d,e,a,b,c,f,g,h,h,h,e,a];

¿Cómo puedo contar cuántos a,b,c hay en la matriz? Quiero tener un resultado como:

a = 3
b = 1
c = 2
d = 2

etc.

detno29 avatar Oct 16 '13 11:10 detno29
Aceptado

const counts = {};
const sampleArray = ['a', 'a', 'b', 'c'];
sampleArray.forEach(function (x) { counts[x] = (counts[x] || 0) + 1; });
console.log(counts)
Expandir fragmento

SheetJS avatar Oct 16 '2013 04:10 SheetJS

Algo como esto:

uniqueCount = ["a","b","c","d","d","e","a","b","c","f","g","h","h","h","e","a"];
var count = {};
uniqueCount.forEach(function(i) { count[i] = (count[i]||0) + 1;});
console.log(count);
Expandir fragmento

Utilice un bucle for simple en lugar de forEach si no desea que esto se rompa en navegadores más antiguos.

loxxy avatar Oct 16 '2013 04:10 loxxy

Me encontré con esta pregunta (muy antigua). Curiosamente, falta la solución más obvia y elegante (en mi humilde opinión): Array.prototype.reduce(...) . Todos los navegadores principales admiten esta función desde aproximadamente 2011 (IE) o incluso antes (todos los demás):

var arr = ['a','b','c','d','d','e','a','b','c','f','g','h','h','h','e','a'];
var map = arr.reduce(function(prev, cur) {
  prev[cur] = (prev[cur] || 0) + 1;
  return prev;
}, {});

// map is an associative array mapping the elements to their frequency:
console.log(map);
// prints {"a": 3, "b": 2, "c": 2, "d": 2, "e": 2, "f": 1, "g": 1, "h": 3}
Expandir fragmento

EDITAR:

Al usar el operador coma en una función de flecha, podemos escribirlo en una sola línea de código:

var arr = ['a','b','c','d','d','e','a','b','c','f','g','h','h','h','e','a'];
var map = arr.reduce((cnt, cur) => (cnt[cur] = cnt[cur] + 1 || 1, cnt), {});

// map is an associative array mapping the elements to their frequency:
console.log(map);
// prints {"a": 3, "b": 2, "c": 2, "d": 2, "e": 2, "f": 1, "g": 1, "h": 3}
Expandir fragmento

Sin embargo, como esto puede ser más difícil de leer/comprender, probablemente deberíamos atenernos a la primera versión.

isnot2bad avatar Oct 01 '2015 11:10 isnot2bad

function count() {
    array_elements = ["a", "b", "c", "d", "e", "a", "b", "c", "f", "g", "h", "h", "h", "e", "a"];

    array_elements.sort();

    var current = null;
    var cnt = 0;
    for (var i = 0; i < array_elements.length; i++) {
        if (array_elements[i] != current) {
            if (cnt > 0) {
                document.write(current + ' comes --> ' + cnt + ' times<br>');
            }
            current = array_elements[i];
            cnt = 1;
        } else {
            cnt++;
        }
    }
    if (cnt > 0) {
        document.write(current + ' comes --> ' + cnt + ' times');
    }

}

count();
Expandir fragmento

Violín de demostración

También puede utilizar funciones de orden superior para realizar la operación. ver esta respuesta