Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

143
Vistas
Javascript: mezcle dos matrices de objetos ordenados por fecha y sin repeticiones

Tengo dos listas:

 let originalDocs = [ { id: "sara", date: new Date("01/01/2022") }, { id: "vic", date: new Date("10/26/2020") } ]; let newDocs = [ { id: "vic", date: new Date("01/02/2022") }, { id: "raul", date: new Date("05/05/2021") } ];

Necesito mezclar ambas listas, ordenando por fecha (en orden descendente) y sin repeticiones.

Para ello, he decidido:

  1. Elimine el conjunto de elementos de la matriz original que se incluyen en la nueva matriz (es decir, eliminando la intersección) sin modificar la matriz original.
  2. Mezcle la matriz resultante ordenando por fecha.

Este es mi código actual:

 function removeIntersection(originalDocs, newDocs) { return originalDocs.filter((originalDoc) => { const index = newDocs.findIndex( (newDoc) => newDoc.id === originalDoc.id ); return index === -1; }); } function mixInOrder(originalDocs, newDocs) { return [...newDocs, ...originalDocs] .sort((a, b) => b.date - a.date); } // // MAIN // let originalDocs = [ { id: "sara", date: new Date("01/01/2022") }, { id: "vic", date: new Date("10/26/2020") } ]; let newDocs = [ { id: "vic", date: new Date("01/02/2022") }, { id: "raul", date: new Date("05/05/2021") } ]; const result = mixInOrder( removeIntersection(originalDocs, newDocs), newDocs ); console.log(result);

¿Cómo puedo hacer lo mismo de una manera más óptima, es decir, sin la necesidad de fusionar (usando la sintaxis extendida) la lista antes de ordenarla o eliminar la intersección en O(1).

Quiero decir, ¿es posible simplemente insertar para evitar la copia?

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Puede lograr fácilmente el resultado usando Set y reduce como:

  • Cree una nueva matriz agregando primero los documentos originalDocs y luego newDocs .
  • Use reduce para recorrer la matriz recién creada y luego filtrar los objetos.

Puede usar Set para verificar la existencia de una clave de manera eficiente

  • Después de filtrar, puede ordenarlo en consecuencia.

 let originalDocs = [ { id: 'sara', date: new Date('01/01/2022'), }, { id: 'vic', date: new Date('10/26/2020'), }, ]; let newDocs = [ { id: 'vic', date: new Date('01/02/2022'), }, { id: 'raul', date: new Date('05/05/2021'), }, ]; const set = new Set(); const result = [...originalDocs, ...newDocs].reduce((acc, curr) => { if (!set.has(curr.id)) { acc.push(curr); set.add(curr.id); } return acc; }, []) .sort((a, b) => b.date - a.date); console.log(result);

about 4 years ago · Juan Pablo Isaza Denunciar

0

Aquí se explica cómo hacer esto usando un mapa JS, donde usa la id como identificador:

 let originalDocs = [ { id: "sara", date: new Date("01/01/2022") }, { id: "vic", date: new Date("10/26/2020") } ]; let newDocs = [ { id: "vic", date: new Date("01/02/2022") }, { id: "raul", date: new Date("05/05/2021") } ]; const map = new Map(originalDocs.map(el => [el.id, el])); newDocs.forEach(el => map.set(el.id, el)); const sorted = [...map.values()].sort((a, b) => a.date - b.date); console.log(sorted)

Esto anula cualquier entrada de originalDocs con una entrada de newDocs si tienen la misma id .

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda