Estoy tratando de crear un pequeño proyecto donde pueda contar la cantidad de elementos en una matriz. Esta parte ya la he hecho. Mi pregunta es ¿cómo puedo solucionar un problema de conteo? Estoy usando un método de mapeo para obtener el contador de ocurrencias de mi elemento, pero quiero poner los datos en una matriz. La única forma que conozco es tomar los datos del mapeo con .get. La forma en que lo estoy haciendo es usando esta primera parte aquí:
let winners = [1, 2, 3, 2]; let nullArray = []; let mode = new Map([...new Set(winners)].map( k => [k, winners.filter(t => t === k).length] )); for (let n in winners) { nullArray.push(mode.get(winners[n])); console.log(nullArray); }Sin embargo, esto *n impulsará las coincidencias. Por ejemplo, si tiene l=[1,2,2], porque l[1]=2 y l[2]=2, se insertarán en nullArray como 2, sin embargo, también se insertará l[2 ] y l[1] ya que los valores son diferentes. Si tiene tres coincidencias, se duplicaría 3 veces, y así sucesivamente. Para contrarrestar esto, intenté crear un detector que calculara cuándo los mismos números en nullArray son de la misma copia pero en un orden diferente. Para hacer esto, usé el código que tengo a continuación (combinado con el código original)
let winners = [1, 2, 3, 2]; let nullArray = []; let mode = new Map([...new Set(winners)].map( k => [k, winners.filter(t => t === k).length] )); for (let n in winners) { nullArray.push(mode.get(winners[n])); console.log(nullArray); } for (let num in nullArray) { for (let c in nullArray) { if (nullArray[num] === nullArray[c] && winners[num] === winners[c]) { nullArray.splice(num, 1); } console.log(nullArray); } }Sin embargo, cada vez que intento esto, el resultado específico de esta matriz es [2,2]. ¿Cómo podría hacer una solución general que elimine todas las copias duplicadas, dejando solo una copia del recuento de números (que en el caso de [1,2,3,2], querría nullArray=[1,2,1 ] como salida)
Puedes hacer algo como esto.
Si no te importa el orden, puedes hacer lo siguiente.
const remove_dup_and_count = (winners = [1, 2, 3, 2]) =>{ let map = {} //count elements for (let n in winners) { const curr_val = winners[n] //duplicate, so we increment count if(curr_val in map) map[curr_val] += 1 //first seen, so we start at 1 else map[curr_val] = 1 } //lets grab the array of all keys in map const keys_arr = Object.keys(map) let count_arr = [] for(let i of keys_arr){ count_arr.push(map[i]) } return count_arr } console.log(remove_dup_and_count())Si te importa el orden, esta es tu mejor apuesta:
const remove_dup_and_count = (winners = [1, 2, 3, 2]) =>{ let map = new Map() //count elements for (let n in winners) { const curr_val = winners[n] //duplicate, so we increment count if(map.get(curr_val)) map.set(curr_val, map.get(curr_val) + 1) //first seen, so we start at 1 else map.set(curr_val,1) } let count_arr = [] //lets grab the array of all keys in map for (const [key, value] of map) { count_arr.push(value) } return count_arr } console.log(remove_dup_and_count())Creo que puede usar el método .reduce() y luego recuperar cuántas veces se repite el valor en la matriz usando map.values(); algo como el siguiente fragmento:
const winners = [1, 2, 3, 2]; const mapWinners = winners.reduce((winnersAccumulator, singleWinner) => winnersAccumulator.set(singleWinner, (winnersAccumulator.get(singleWinner) || 0) + 1), new Map()) console.log([...mapWinners.values()])