es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Comparar dos matrices de objetos mediante las claves de JavaScript.

Estoy trabajando con javascript y tengo dos arreglos que, para este ejemplo, lucen así:

const arr1 = [
    { url: 1, 'title': 'A', 'title2': 'A2' },
    { url: 2, 'title': 'B', 'title2': 'B2' },
    { url: 3, 'title': 'C', 'title2': 'C2' },
    { url: 4, 'title': 'D', 'title2': 'D2' },
    { url: 5, 'title': 'E', 'title2': 'E2' },
];

const arr2 = [
    { url: 1, 'title': 'A', 'title2': 'J2' },
    { url: 2, 'title': 'J', 'title2': 'B2' },
    { url: 3, 'title': 'C', 'title2': 'C2' },
    { url: 4, 'title': 'D', 'title2': 'D2' },
    { url: 5, 'title': 'K', 'title2': 'E2' },
];

Me gustaría obtener del segundo arreglo aquellos objetos que son diferentes ya sea en la propiedad title o title2.

He probado lo siguiente pero no me funciona, ¿en qué me estoy equivocando?

const res = arr2.filter((page1) => !arr1.some(page2 => page1.title === page2.title || page2.title2 == page1.title2 ))

El resultado esperado para este ejemplo es el siguiente:

[{ url: 1, 'title': 'A', 'title2': 'J2' },{ "url": 2,"title":"J","title2":"B2"},{"url":5,"title":"K","title2":"E2"}]
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema con tu código es que estás utilizando la función some para comparar los objetos del array 1 con cada objeto del array 2, pero no estás considerando el caso en el que el objeto del array 2 puede no existir en absoluto en el array 1. En su lugar, puedes utilizar la función find para verificar si hay un objeto en el array 1 con la misma url y luego comparar las propiedades title y title2. Aquí tienes un ejemplo de código que debería funcionar:

    const res = arr2.filter(page2 => {
      const page1 = arr1.find(p => p.url === page2.url);
      return !page1 || page1.title !== page2.title || page1.title2 !== page2.title2;
    });
    

    Este código primero utiliza la función filter para iterar sobre cada objeto en el array 2, y luego utiliza la función find para buscar un objeto en el array 1 con la misma url. Si no hay tal objeto, page1 será undefined. De lo contrario, page1 hará referencia al objeto del array 1.

    El resto del código verifica si page1 es undefined (lo que significa que el objeto solo existe en el array 2), o si las propiedades title o title2 de page1 y page2 son diferentes. Si alguna de estas condiciones es verdadera, se considera que el objeto del array 2 es diferente y se incluirá en el array res.

    Con los ejemplos de arrays que proporcionaste, este código debería producir el resultado esperado:

    [
      { url: 1, 'title': 'A', 'title2': 'J2' },
      { url: 2, 'title': 'J', 'title2': 'B2' },
      { url: 5, 'title': 'K', 'title2': 'E2' }
    ]
    

Comments are closed.