Estoy tratando de recorrer un objeto anidado que se ve así:
let obj = { cols: [ { name: 'name', type: 'String' }, { name: 'dob', type: 'Number' }, { name: 'address', type: 'String' }, { name: 'income', type: 'String' }, { name: 'vehicleNumber', type: 'Number' }, { name: 'assets', type: 'Number' } ], row: [ { name: 'randomInfo', columns: ['name', 'address', 'assets'], } ] }
Estoy usando la lógica a continuación para recorrer las matrices del objeto, comparar si son iguales y, si lo son, las devolveré en una matriz. Sin embargo, estoy tratando de devolver todo el objeto dentro de la tecla cols. Por ejemplo, si hay elementos coincidentes dentro del valor del nombre de la matriz cols con el valor de la clave de las columnas de la matriz de filas, (cols.name === fila.columnas[elemento], si hay una coincidencia, devuelve el objeto cols)
//loop through the obj and get the keys before this let cols = cols.map(col => col.name); let row = row.map(ind => ind.columns); let rowNamesFlattened = [].concat.apply([], row); let matchingCols = cols.filter(element => row.includes(element));
El objeto matchingCols
ahora tiene los nombres coincidentes, pero en última instancia también quiero devolver su tipo. ¿Alguna idea de cómo se puede hacer esto?
puede usar el filter
directamente en la matriz cols
. Sin embargo, aquí asumí que la matriz de row
solo tiene 1 elemento
let obj = { cols: [ { name: 'name', type: 'String' }, { name: 'dob', type: 'Number' }, { name: 'address', type: 'String' }, { name: 'income', type: 'String' }, { name: 'vehicleNumber', type: 'Number' }, { name: 'assets', type: 'Number' } ], row: [ { name: 'randomInfo', columns: ['name', 'address', 'assets'], } ] } let matchingCols = obj.cols.filter(({name}) => obj.row[0].columns.includes(name)) console.log(matchingCols)
En caso de que haya varios elementos presentes dentro de la matriz de row
. puede usar flatMap
para obtener una lista plana de columnas y luego el mismo procedimiento que el anterior
let obj = { cols: [ { name: 'name', type: 'String' }, { name: 'dob', type: 'Number' }, { name: 'address', type: 'String' }, { name: 'income', type: 'String' }, { name: 'vehicleNumber', type: 'Number' }, { name: 'assets', type: 'Number' } ], row: [ { name: 'randomInfo', columns: ['name', 'address', 'assets'], }, { name: 'randomInfo2', columns: ['dob','name'], } ] } let filtered = obj.cols.filter(({name}) => obj.row.flatMap(ind => ind.columns).includes(name)) console.log(filtered)
Otra solución para obtener emparejados y no emparejados de una sola vez usando reduce
. por lo que no necesita 2 llamadas de filtro. hizo referencia a esto
let obj = { cols: [ { name: 'name', type: 'String' }, { name: 'dob', type: 'Number' }, { name: 'address', type: 'String' }, { name: 'income', type: 'String' }, { name: 'vehicleNumber', type: 'Number' }, { name: 'assets', type: 'Number' } ], row: [ { name: 'randomInfo', columns: ['name', 'address', 'assets'], }, { name: 'randomInfo2', columns: ['dob','name'], } ] } let flatted = obj.row.flatMap(ind => ind.columns); const result = obj.cols.reduce((acc, curr) => { acc[flatted.includes(curr.name) ? 'match' : 'unmatch'].push(curr); return acc; }, { match: [], unmatch: [] }); console.log(result)