Cómo contar valores duplicados en una matriz en javascript
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.
const counts = {};
const sampleArray = ['a', 'a', 'b', 'c'];
sampleArray.forEach(function (x) { counts[x] = (counts[x] || 0) + 1; });
console.log(counts)
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);
Utilice un bucle for simple en lugar de forEach si no desea que esto se rompa en navegadores más antiguos.
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}
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}
Sin embargo, como esto puede ser más difícil de leer/comprender, probablemente deberíamos atenernos a la primera versión.
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();
Violín de demostración
También puede utilizar funciones de orden superior para realizar la operación. ver esta respuesta