Como dice el título, estoy tratando de almacenar una lista de objetos duplicados basados en pares clave:valor específicos que son iguales.
El objetivo es analizar la información y devolver una lista de elementos duplicados. Un elemento duplicado es cuando la identificación, el título y los elementos coinciden. El principal problema que tengo con esto es que dentro de cada objeto, una de las claves para comparar es una matriz que contiene una lista de objetos como valores.
¿Cómo resolvería este problema, recorriendo una matriz de objetos para determinar si la matriz de elementos está duplicada?
A continuación se muestra solo un pequeño ejemplo de los datos JSON.
Debería devolver: objeto completo de pk:"0002" y pk"0003" ya que están duplicados. No debería devolver Object pk:"0001" y pk "0004" ya que su conjunto de elementos:[{}] no son iguales.
Mi intento puede determinar si la identificación y los títulos coinciden, pero no puedo hacer que los elementos coincidan:
var data = [ { pk: "0001", ID: "1A", title: "Material 15", items: [{ title: "Info", value: "" }, { title: "Type", value: "" }, { title: "EXTRA", value: "55" }, ], }, { pk: "0002", ID: "1A", title: "Material 1", items: [{ title: "Info", value: "" }, { title: "Type", value: "" }, ], }, { pk: "0003", ID: "1A", title: "Material 1", items: [{ title: "Info", value: "" }, { title: "Type", value: "" }, ], }, { pk: "0004", ID: "1A", title: "Material 15", items: [{ title: "Info", value: "" }, { title: "Type", value: "" }, ], }, ]; let duplicates = []; data.forEach((el, i) => { data.forEach((element, index) => { if (i === index) return null; if (element.ID === el.ID && element.title === el.title) { if (!duplicates.includes(el)) { //Issue here -> I want to compare the array of items but im not sure how to ? //Attempt: // I think I understand that this is wrong due to the indexes not sure how you would find this ? // if (element.items[i] === el.items[i]) { // duplicates.push(el); // console.log("Test"); // } duplicates.push(el); } } }); }); console.log("duplicates", duplicates);Puede contar los elementos con los mismos valores en cadena y obtener sus objetos como resultado.
const data = [{ pk: "0001", ID: "1A", title: "Material 15", items: [{ title: "Info", value: "" }, { title: "Type", value: "" }, { title: "EXTRA", value: "55" }] }, { pk: "0002", ID: "1A", title: "Material 1", items: [{ title: "Info", value: "" }, { title: "Type", value: "" }] }, { pk: "0003", ID: "1A", title: "Material 1", items: [{ title: "Info", value: "" }, { title: "Type", value: "" }] }, { pk: "0004", ID: "1A", title: "Material 15", items: [{ title: "Info", value: "" }, { title: "Type", value: "" }] }], keys = ['ID', 'title', 'items'], map = data.reduce((m, o) => { const key = keys.map(k => JSON.stringify(o[k])).join('|'), [count = 0, array = []] = m.get(key) || []; return m.set(key, [count + 1, [...array, o]]); }, new Map), duplicates = Array .from(map.values(), ([count, array]) => count === 1 ? []: array) .flat(); console.log(duplicates); .as-console-wrapper { max-height: 100% !important; top: 0; }