Tengo dos matrices, quiero que estas dos se combinen y los elementos duplicados no se encienden y solo se agregan elementos nuevos y veo la matriz combinada en la consola. También quiero ver el elemento duplicado en la lista de la consola. Quiero decir, Necesito dos salidas, una que me diga qué es un duplicado y otra que me muestre una nueva matriz de combinaciones de dos matrices sin duplicados. Escribí este código pero no funciona correctamente Gracias por guiarme
Rendimiento esperado:
newContact : [ { "id": 1, "name": "Oliver" }, { "id": 2, "name": "Liam" } { "id": 3, "name": "James" } { "id": 4, "name": "Lucas" } ] duplicateContacts: Oliver let array1 = [ { id: 1, name: "Oliver" }, { id: 2, name: "Liam" }, ]; let array2 = [ { id: 1, name: "Oliver" }, { id: 3, name: "James" }, { id: 4, name: "Lucas" }, ]; let newContact = array1.filter((item) => item.id !== array2.id); console.log("newContact :", newContact); console.log("duplicateContacts:");Suponga que duplicado significa la misma identificación, agregue entradas de matriz a un mapa para encontrar duplicados, y el mapa contiene elementos únicos
const array1 = [ { id: 1, name: "Oliver" }, { id: 2, name: "Liam" }, ]; const array2 = [ { id: 1, name: "Oliver" }, { id: 3, name: "James" }, { id: 4, name: "Lucas" }, ]; const duplicates = []; const map = new Map(); const fill = (array) => array.forEach(item => { if (map.has(item.id)) { duplicates.push(item); } else { map.set(item.id, item); } }); fill(array1); fill(array2); console.log(duplicates); console.log([...map.values()]);Editar
Para tomar matrices como entrada, cree una función
const inspect = (...arrays) => { const duplicates = []; const map = new Map(); const fill = (array) => array.forEach(item => { if (map.has(item.id)) { duplicates.push(item); } else { map.set(item.id, item); } }); arrays.forEach(array => fill(array)); console.log(duplicates); console.log([...map.values()]); }; const array1 = [ { id: 1, name: "Oliver" }, { id: 2, name: "Liam" }, ]; const array2 = [ { id: 1, name: "Oliver" }, { id: 3, name: "James" }, { id: 4, name: "Lucas" }, ]; inspect(array1, array2);Puede tomar un Set de array2 con todas las id y filtrar la otra matriz.
const array1 = [{ id: 1, name: "Oliver" }, { id: 2, name: "Liam" }], array2 = [{ id: 1, name: "Oliver" }, { id: 3, name: "James" }, { id: 4, name: "Lucas" }], set2 = new Set(array2.map(({ id }) => id)), duplicateContacts = array1.filter(({ id }) => set2.has(id)); allContacts = [...array1, ...array2].filter( (s => ({ id }) => !s.has(id) && s.add(id)) (new Set) ), console.log("allContacts:", allContacts); console.log("duplicateContacts:", duplicateContacts); .as-console-wrapper { max-height: 100% !important; top: 0; }con tres métodos:
filter para obtener una matriz de elementos duplicados
map para recuperar solo una matriz de una columna
some para describir cómo se deben comparar los objetos en la matriz
const duplicates = array1.filter(value => array2.some(oneElement => oneElement.id === value.id)); const duplicatesId = array1.filter(value => array2.some(oneElement => oneElement.id === value.id)).map(oneElement => oneElement.id); const mergedArray = [ ...array1, ...array2.filter(value => !duplicatesId.some(oneDuplicate => oneDuplicate === value.id)) ]; const array1 = [ { id: 1, name: "Oliver" }, { id: 2, name: "Liam" }, ]; const array2 = [ { id: 1, name: "Oliver" }, { id: 3, name: "James" }, { id: 4, name: "Lucas" }, ]; const duplicates = array1.filter(value => array2.some(oneElement => oneElement.id === value.id)); const duplicatesId = array1.filter(value => array2.some(oneElement => oneElement.id === value.id)).map(oneElement => oneElement.id); const mergedArray = [ ...array1, ...array2.filter(value => !duplicatesId.some(oneDuplicate => oneDuplicate === value.id)) ]; console.log(duplicates); console.log(duplicatesId); console.log(mergedArray);