Tengo un 2d de esta matriz con pocos valores. Quiero contar los duplicados en esta matriz y obtener una nueva matriz 2d con los valores y, al final, la cantidad de conteos.
let colors = [ ['blue', 'green', 5.00, 57], ['blue', 'green', 5.00, 57], ['yellow', 'green', 8.30, 84], ['blue', 'green', 5.00, 57], ['orange', 'blue', 7.00, 0], ['yellow', 'green', 8.30, 84], ]; function count_duplicate() { let counts = [] for (let i = 0; i < colors.length; i++) { if (counts[colors[i]]) { counts[colors[i]] += 1 } else { counts[colors[i]] = 1 } } console.log(counts); } count_duplicate();ahora tengo este resultado
counts = [blue,green,5,57: 3, yellow,green,8.3,84: 2, orange,blue,7,0: 1]pero necesito la matriz como esta
counts = [[blue,green,5,57,3], [yellow,green,8.3,84,2], [orange,blue,7,0,1]]Puede usar Map aquí para lograr el resultado:
let colors = [ ["blue", "green", 5.0, 57], ["blue", "green", 5.0, 57], ["yellow", "green", 8.3, 84], ["blue", "green", 5.0, 57], ["orange", "blue", 7.0, 0], ["yellow", "green", 8.3, 84], ]; function count_duplicate() { let counts = new Map(); for (let i = 0; i < colors.length; i++) { const data = counts.get(colors[i].toString()); if (data) data.count++; else counts.set(colors[i].toString(), { value: colors[i], count: 1 }); } const result = []; for (let [, { value, count }] of counts) { result.push([...value, count]); } return result; } console.log(count_duplicate());cambie de array [] a an object {} , para manipular fácilmente cada sub-array(row) cuántas veces ocurre, ¡debe ser un objeto, no una matriz! y Usando Object.entries recorriendo su key(str) and value(times) , y devuelve str dividido por coma y sus tiempos de ocurrencia .
let colors = [ ["blue", "green", 5.0, 57], ["blue", "green", 5.0, 57], ["yellow", "green", 8.3, 84], ["blue", "green", 5.0, 57], ["orange", "blue", 7.0, 0], ["yellow", "green", 8.3, 84], ]; function count_duplicate() { let counts = {};//<-- for (let i = 0; i < colors.length; i++) { if (counts[colors[i]]) { counts[colors[i]] += 1; } else { counts[colors[i]] = 1; } } console.log(counts); //{ 'blue,green,5,57': 3, 'yellow,green,8.3,84': 2, 'orange,blue,7,0': 1 } const res = Object.entries(counts).map((count) => { [str, times] = count; //['blue,green,5,57': 3] return [...str.split(","), times];//[ 'blue', 'green', '5', '57', 3 ] }); console.log(res); } count_duplicate();Resultado:
[ [ 'blue', 'green', '5', '57', 3 ], [ 'yellow', 'green', '8.3', '84', 2 ], [ 'orange', 'blue', '7', '0', 1 ] ]No sé acerca de la sintaxis elegante, pero usar un hashmap debería funcionar, que es solo un objeto de JavaScript.
let colors = [ ['blue', 'green', 5.00, 57], ['blue', 'green', 5.00, 57], ['yellow', 'green', 8.30, 84], ['blue', 'green', 5.00, 57], ['orange', 'blue', 7.00, 0], ['yellow', 'green', 8.30, 84], ]; const hashmap = {}; colors.forEach(color => { const key = JSON.stringify(color); if(!hashmap[key]) hashmap[key] = 1; else hashmap[key]++; if(hashmap[key] == 1) return color; }); console.log(hashmap); const uniqueArray = []; for(const key in hashmap) uniqueArray.push(JSON.parse(key)); console.log(uniqueArray);