¿Cómo puedo filtrar una matriz a todos los objetos que pueden parecer similares por ciertas claves sin saber el valor de esas claves?
Imagina que tengo un objeto como este:
let list = [ { name: 'Adam', age: '10', uniqueStuff: 'a'}, { name: 'Brian', age: '2', uniqueStuff: 'b'}, { name: 'Carley', age: '15', uniqueStuff: 'c'}, { name: 'Adam', age: '2', uniqueStuff: 'd'}, { name: 'Christy', age: '15', uniqueStuff: 'e'}, { name: 'Adam', age: '10', uniqueStuff: 'f'}, ]Quiero que el resultado sea:
let list = [ { name: 'Adam', age: '10', uniqueStuff: 'a'}, { name: 'Adam', age: '10', uniqueStuff: 'f'}, ] Estos pueden parecer duplicados porque comparten el mismo nombre y edad, pero uniqueStuff es diferente. Entonces, no estoy tratando de eliminar posibles duplicados, sino de obtener una matriz de todos los objetos similares en la matriz.
Algo así como responder a la pregunta "¿cuántos niños tenemos con los mismos nombres y las mismas edades?"
Esto sería similar a las consultas "tener conteo (*)> 1" de MySQL.
Me está costando mucho buscar una respuesta o descubrir un método LoDash. Todo lo que encuentro se trata de eliminar duplicados u obtener solo los duplicados, por lo que solo hay 1 de cada elemento. En cambio, quiero obtener todos los elementos que están duplicados y tienen duplicados. Entonces, cada "coincidencia" en mi matriz debe tener 2 o más elementos. Por ejemplo, 2 o más Adams de 10 años, 2 o más Amys de 6 años, etc.
¡Gracias por adelantado!
const reduced = list.reduce((prev, curr) => { const key = `${curr.name}, ${curr.age}` return { ...prev, [key]: [...(prev[key] || []), curr] } }, {}) const filtered = Object.values(reduced).filter(v => v.length > 1) const flatted = filtered.flat()Puede eliminar la última línea si prefiere tener cada conjunto de 2 en una matriz.