Quería filtrar los datos. Quería verificar si los datos en data1 se encuentran en data2 y verificar si tiene mensajes de error. Por favor, compruebe mi código a continuación. Hay una mejor manera de hacerlo?
datos1
[ { "ids": "0111", }, { "ids": "0222", }, { "ids": "0333", } ]datos2
[ { "id": "0111", "errorMessages": [ { "message": ["sample error message 1"] } ] }, { "id": "0333", "errorMessages": [] } ]Código
const output= data1.filter( (element) => element.ids === data2.find((data) => data).id ); console.log("output", output);.find((data) => data) no hace nada útil: cada elemento de la matriz es un objeto, lo cual es cierto, por lo que siempre devolverá el primer elemento de la matriz.
Si .find un elemento coincidente en la otra matriz, entonces un mejor enfoque sería hacer un Conjunto de las ID encontradas en la otra matriz primero (La búsqueda de conjuntos es mucho más rápida - O(1) - que .find , que es O(n) ).
También debe implementar la lógica para verificar si los errorMessages de error están vacíos.
const data1 = [ { "ids": "0111", }, { "ids": "0222", }, { "ids": "0333", } ] const data2 = [ { "id": "0111", "errorMessages": [ { "message": ["sample error message 1"] } ] }, { "id": "0333", "errorMessages": [] } ] const ids = new Set( data2 .filter(item => item?.errorMessages.length) .map(item => item.id) ); const output= data1.filter( element => ids.has(element.ids) ); console.log("output", output);Sin Conjunto, pero use Objeto como mapa.
const IDKeys = {}; data2.forEach(data => { if (data.errorMessages.length){ IDKeys[data.id] = true; // means valid } }) const filteredArray = data1.filter(data => IDKeys[data.id]);Esto sería solo O (n) ya que acceder a la clave en el objeto es O (1)