Duda javascript comparar 2 arrays con objetos

re4q

Hola, llevo ya un buen rato rompiéndome la cabeza con algo que en principio debería de ser facil..

Tengo 2 arrays:

array1 = [
    {  key: 'hola',
       apellido: 'adiós'
    },
    {  key: 'hello',
       apellido: 'bye'
    },
]
array2 = [
    {  place: 'hola',
       order: 0
    },
    {  place: 'test',
       order: 1
    },
]

Objetivo: Crear un array3 con los objetos del array2 que no coincida el attributo place del array2 con key del array1

Resultado buscado:

array3 = [
    {  place: 'test',
       order: 1
    },
]

Tengo esto pero no acaba de tirar:

const array3 = array2.reduce((metadataFiltered, data) => {
          if (array1.some(d => d.key !== data.place)) {
            metadataFiltered = [...metadataFiltered, data];
          }

      return metadataFiltered;
    }, []);

No se si me explicado claramente. Llevo un buen rato con esto y no sé si es pq estoy espeso o directamente soy retrasado.

Gracias.

S

Tienes que crear un Set que contenga todos los valores posibles del valor place del segundo array y luego en un loop (edito: filtro) del primer array comprobando si la propiedad key existe en el Set.
Lo que estas haciendo aparte del error que tengas es completamente ineficiente.

1 respuesta
ReloaD1010
const array3 = array2.filter(item => !array1.some(foo => foo.key === item.place))

El Array.reduce() es para reducir de una array a un valor, no tiene mucho sentido usarlo aqui

2 respuestas
re4q

#2 #3 Gracias a los dos.

La solución que propone Reload me ha funcionado, de echo estoy convencido de haber probado algo parecido pero por alguna razón no me salía y he desestimado.

Si, la verdad que me estaba complicando la vida a mas no poder..

1 respuesta
S

#3 y #4 Ese algoritmo es altamente ineficiente. Normalmente para filtrar dos listas creas un set con una lista e iteras con la siguiente.

  const keys = new Set(array1.map( v => v.key));
  const result = array2.filter( v => !keys.has(v.place));
1 1 respuesta
re4q

#5 Lo tendré en cuenta, nunca lo he implementado así. Gracias.

Usuarios habituales