Tengo dos matrices de objetos y quiero encontrar los elementos que faltan en la segunda matriz, pero que son parte de la primera matriz, básicamente matriz1-matriz2. Traté de usar el filtro pero no puedo obtener el resultado deseado. Por favor, ayuda. Gracias por adelantado.

Aquí está el código:

 testData=[
       {id: 0, name: "policy001"},
       {id: 2, name: "policy002"}];
       sourceData= [
          {id: 0, name: "policy001"},
          {id: 2, name: "policy002"},
          {id: 3, name: "policy003"},
          {id: 4, name: "policy004"},
          {id: 5, name: "policy005"}, 
      ];

      let missing = sourceData.filter(item =>  testData.indexOf(item) < 0);
      console.log("Miss")
      console.log(missing )//Returns the sourceData instead of diff.
0
rock11 10 may. 2019 a las 09:21

3 respuestas

La mejor respuesta

Pruebe findIndex() :

El método findIndex () devuelve el índice del primer elemento de la matriz que satisface la función de prueba proporcionada. De lo contrario, devuelve -1, lo que indica que ningún elemento pasó la prueba.

testData = [{
        id: 0,
        name: "policy001"
    },
    {
        id: 2,
        name: "policy002"
    }
];
sourceData = [{
        id: 0,
        name: "policy001"
    },
    {
        id: 2,
        name: "policy002"
    },
    {
        id: 3,
        name: "policy003"
    },
    {
        id: 4,
        name: "policy004"
    },
    {
        id: 5,
        name: "policy005"
    },
];

console.log(sourceData.filter(item => testData.findIndex(x => x.id == item.id) < 0))
1
Prashant Pimpale 10 may. 2019 a las 06:30

Obtiene este comportamiento no deseado porque lo que está haciendo en su filtro es comparar las referencias de los elementos en lugar de sus valores. si desea comparar que esos objetos son realmente idénticos en valores (porque tienen referencias diferentes), debe hacer lo siguiente:

let missing = sourceData.filter(sourceItem => 
  testData.every(testItem =>
    testItem.id !== sourceItem.id && testItem.name !== sourceItem.name
  )
)

Esto significa: filtrar los elementos de sourceData, para los cuales ninguno de los elementos en testData tiene la misma identificación o nombre. Ellos están perdidos".

1
Smytt 10 may. 2019 a las 07:00

La razón por la que su código no funcionó es que el objeto dentro de la matriz son "direcciones" de los objetos. Entonces, por supuesto, el indexOf no funcionó

Pruebe a continuación:

let missing = sourceData.filter(a => !testData.find(b => a.id === b.id));
1
Qiaosen Huang 10 may. 2019 a las 06:27