Actualmente tengo 2 matrices. Una es una matriz plana que contiene varias cadenas y la otra es una matriz anidada. Estoy tratando de devolver mi matriz anidada solo con los objetos que coinciden con las cadenas de mi primera matriz. Lo que me encuentro actualmente es que se devuelve toda mi matriz si solo hay una coincidencia opuesta al objeto coincidente.
JS:
const rootIds = ["18828861", "15786287", "13435676"] const filtData = [ { year: "2022", awards: [ { list: [ { rootId: "18828861", name: "Globe", }, { rootId: "15786222", name: "Golden" }, ], }, ], }, { year: "2021", awards: [ { list: [ { rootId: "15786223", name: "Car", }, { rootId: "13435676", name: "Red", }, ], }, { list: [ { rootId: "15786287", name: "Black", }, { rootId: "1578622", name: "Blue", }, ], }, ], }, ]; const res = rootIds.map((a) => a); const findIds = filtData.map(obj => obj.awards.filter(( { list }) => list.find(o => rootIds.includes(o.rootId)))); console.log("filtData====", findIds)La salida deseada sería:
"filtData====", [[{ list: [{ name: "Globe", rootId: "18828861" }] }], [{ list: [{ name: "Red", rootId: "13435676" }] }, { list: [{ name: "Black", rootId: "15786287" }] }]]JsFiddle de demostración que no funciona: https://jsfiddle.net/hb7ej5sg/
Encontré la causa en:
const findIds = filtData.map(obj => obj.awards.filter(( { list }) => list.find(o => rootIds.includes(o.rootId)))); Dado que está utilizando #filter en la matriz obj.awards en lugar de #map y #find on list en lugar de #filter , obtiene la matriz completa de obj.awards[].list .
El uso de los métodos correctos de la siguiente manera solucionaría el problema:
const findIds = filtData.map(obj => obj.awards.map(( { list }) => list.filter(o => rootIds.includes(o.rootId)) ) );