Estoy probando esta solución pero no me está dando el resultado que quiero. No quiero contar el número de pares de 1 porque en realidad no es un par ya que aparece 4 veces. Necesito contar los pares "perfectos", como en este caso: 5 y 2. Ahora mismo esto me está dando como resultado 4 y debería ser 2.
¿Cómo podría lograr eso? Estoy atascado.
let ar1 = [12, 5, 5, 2, 1, 1, 1, 1, 2]; const countPairs = (ar) => { let obj = {}; ar.forEach((item) => { obj[item] = obj[item] ? obj[item] + 1 : 1; }); return Object.values(obj).reduce((acc, curr) => { acc += Math.floor(curr / 2); return acc; }, 0); }; console.log( countPairs(ar1) )Puede filtrar los valores de los objetos por 2 y contar la lista
let ar1 = [12, 5, 5, 2, 1, 1, 1, 1, 2]; const countPairs = (ar) => { let obj = {}; ar.forEach((item) => { obj[item] = obj[item] ? obj[item] + 1 : 1; }); return Object.values(obj).filter(e => e == 2).length; }; console.log(countPairs(ar1))Esto puede ser de una sola línea usando Map como:
const countPairs(arr) => [...arr.reduce((dict, n) => dict.set(n, (dict.get(n) ?? 0) + 1), new Map()).values(),].filter((n) => n === 2).length; let ar1 = [12, 5, 5, 2, 1, 1, 1, 1, 2]; const countPairs = (arr) => [ ...arr .reduce((dict, n) => dict.set(n, (dict.get(n) ?? 0) + 1), new Map()) .values(), ].filter((n) => n === 2).length; console.log(countPairs(ar1));o eso
const ar1 = [12, 5, 5, 2, 1, 1, 1, 1, 2] , countPerfectPairs = arr => arr.reduce((r,val,i,{[i+1]:next})=> { if(!r.counts[val]) { r.counts[val] = arr.filter(x=>x===val).length if (r.counts[val]===2) r.pairs++ } return next ? r : r.pairs },{counts:{},pairs:0}) console.log( countPerfectPairs(ar1) )Si lo prefiere Detalles:
const ar1 = [12, 5, 5, 2, 1, 1, 1, 1, 2] , countPerfectPairs = arr => arr.reduce((r,val)=> { if(!r.counts[val]) { r.counts[val] = arr.filter(x=>x===val).length if (r.counts[val]===2) r.pairs++ } return r },{counts:{},pairs:0}) console.log( countPerfectPairs(ar1) )