Quiero crear una función que cuente los pares de una matriz y al final cuente los pares, el resultado esperado aquí debería ser:
{ 1: 1, 10: 1, 90: 2 }, 4pero estoy recibiendo
{ 1: 1, 90: 2 }, 3¿Alguien puede dar un consejo sobre cómo volver a trabajar esto? No obtiene 10 como par porque ocurre tres veces, pero debe contarlo como par porque subió dos veces. ¿Hay mejores métodos para crear esto?
const pairs = [90, 10, 1, 2, 3, 4, 5, 10, 1, 90, 90, 90, 10, 22]; function checkPairs(arr) { const result = {} for(let i =0;i<pairs.length;i++) { const counter = pairs.filter(item => item == arr[i]); if(counter.length > 1 && counter.length % 2 == 0) { result[pairs[i]] = counter.length/2; } } return result; } function countPairs(obj) { let result = 0; for([i, t] of Object.entries(obj)) { result+=t; } return result; } const countedPairs = checkPairs(pairs); const counter = countPairs(countedPairs); console.log(countedPairs, counter)Su cheque dice que tiene que haber un número exacto para los pares cuando está haciendo counter.length % 2 == 0
Solo necesita asegurarse de tener 2 o más y simplemente redondear hacia abajo con el piso
const pairs = [90, 10, 1, 2, 3, 4, 5, 10, 1, 90, 90, 90, 10, 22]; function checkPairs(arr) { const result = {} for(let i =0;i<pairs.length;i++) { const counter = pairs.filter(item => item == arr[i]); if(counter.length > 1) { result[pairs[i]] = Math.floor(counter.length/2); } } return result; } function countPairs(obj) { let result = 0; for([i, t] of Object.entries(obj)) { result+=t; } return result; } const countedPairs = checkPairs(pairs); const counter = countPairs(countedPairs); console.log(countedPairs, counter)Su código de filtro hace que haga un bucle mucho más de lo que necesita. Solo tiene que recorrer una vez la matriz y realizar un seguimiento de las veces que la ha visto.
const pairs = [90, 10, 1, 2, 3, 4, 5, 10, 1, 90, 90, 90, 10, 22]; const counts = pairs.reduce(function (o, val) { // update how many times we have seen it. o.count[val] = (o.count[val] || 0) + 1; // is it the a pair yet? if (o.count[val] ===2) { // if it is, reset the count o.count[val] = 0; // update the count for the pair o.pairsCount[val] = (o.pairsCount[val] || 0) + 1; o.totalPairs++; } return o; }, { count: {}, pairsCount: {}, totalPairs: 0}); console.log(counts.pairsCount, counts.totalPairs);¿Qué tal si pruebas este enfoque? Comprobación de que la longitud de la matriz de contadores es uniforme. En caso afirmativo, haga el cálculo regular; de lo contrario, simplemente reste 1 de la longitud del contador.
const pairs = [90, 10, 1, 2, 3, 4, 5, 10, 1, 90, 90, 90, 10, 22]; function checkPairs(arr) { const result = {} for(let i =0;i<pairs.length;i++) { const counter = pairs.filter(item => item == arr[i]); if(counter.length > 1) { result[pairs[i]] = counter.length % 2 == 0 ? counter.length / 2 : (counter.length -1) / 2 ; } } return result; } function countPairs(obj) { let result = 0; for([i, t] of Object.entries(obj)) { result+=t; } return result; } const countedPairs = checkPairs(pairs); const counter = countPairs(countedPairs); console.log(countedPairs, counter)También puedes hacerlo usando Array.prototype.reduce .
1 .total en 1 . const nums = [90, 10, 1, 2, 3, 4, 5, 10, 1, 90, 90, 90, 10, 22], totalPairs = nums.reduce( (acc, num) => { acc[num] ??= 0; acc[num] += 1; if (!(acc[num] % 2)) { acc.total += 1; } return acc; }, { total: 0 } ).total; console.log(totalPairs);