从嵌套对象中的数组中获取值,比较并 return 对象

Get values from arrays inside nested objects, compare and return the object

我正在尝试遍历如下所示的嵌套对象:

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'], 
    } 
  ]
}

我正在使用下面的逻辑遍历对象的数组,比较它们是否相等,如果相等,我将它们 return 放入一个数组中。不过,我正在尝试 return cols 键内的整个对象。例如,如果 cols 数组的名称值与行数组的列键值匹配,(cols.name === row.columns[element],如果匹配 return列对象)

//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));

matchingCols 对象现在具有匹配的名称,但我最终还想 return 它们的类型。知道如何做到这一点吗?

您可以直接在 cols 数组上使用 filter。但是这里我假设 row 数组只有 1 个元素

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)

如果 row 数组中存在多个元素。可以使用 flatMap 来获取列的展平列表,然后使用与上面相同的过程

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)

使用 reduce 一次性获得匹配和不匹配的另一种解决方案。所以不需要 2 个过滤器调用。引用

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)