1

我有一个对象数组。我想提取嵌套对象并将其作为预期输出返回。我的方法已经行不通了,也不确定它是否能有效地迭代大量数据。

const data = [
    {
        name: 'Micheal',
        desc: 'Micheal',
        empObj: {
            empId: 1,
            empName: 'Micheal',
            country: 'UK',
        }
    },
    {
        name: 'Allen',
        desc: 'Allen',
        empObj: {
            empId: 2,
            empName: 'Allen',
            country: 'Germany',

        }
    },
    {
        name: 'Rose',
        desc: 'Rose',
        empObj: {
            empId: 3,
            empName: 'Rose',
            country: 'USA',
        }
    }
];

我需要扁平化/转换数据,如

[
    {
        name: 'Micheal',
        desc: 'Micheal',
        empId: 1,
        empName: 'Micheal',
        country: 'UK',
    },
    {
        name: 'Allen',
        desc: 'Allen',
        empId: 2,
        empName: 'Allen',
        country: 'Germany',
    },
    
    {
        name: 'Rose',
        desc: 'Rose',    
        empId: 3,
        empName: 'Rose',
        country: 'USA',
    
        
    }
]

但我得到

未捕获的类型错误:无法将未定义或 null 转换为对象

const expected = Object.keys(data.empObj).reduce(function(r, k) {
  return r.concat(k, object.empObj[k]);
}, []);

console.log('expected', expected);

谢谢

4

3 回答 3

4

将该map()方法与解构以及展开和休息语法一起使用。

empObj我们可以通过解构键并使用 rest 语法收集数组中每个对象中的其余属性来实现所需的输出。

map()方法的回调函数中,返回一个新对象,empObj使用扩展语法扩展新创建的对象中的属性以及其他属性。

const data = [
  { name: 'Micheal', desc: 'Micheal', empObj: { empId: 1, empName: 'Micheal', country: 'UK' } },
  { name: 'Allen', desc: 'Allen', empObj: { empId: 2, empName: 'Allen', country: 'Germany' } }
];

const result = data.map(({ empObj, ...rest }) => {
  return { ...rest, ...empObj };
});

console.log(result);


您的代码引发错误的原因是因为data它是一个数组,所以data.empObj它是未定义的,并且您将这个未定义的值传递给该Object.keys(...)方法。

于 2021-07-29T05:50:38.973 回答
3

您可以使用地图轻松实现此目的

data.map(({ name, desc, empObj }) => ({ name, desc, ...empObj }))

const data = [
  {
    name: "Micheal",
    desc: "Micheal",
    empObj: {
      empId: 1,
      empName: "Micheal",
      country: "UK",
    },
  },
  {
    name: "Allen",
    desc: "Allen",
    empObj: {
      empId: 2,
      empName: "Allen",
      country: "Germany",
    },
  },
  {
    name: "Rose",
    desc: "Rose",
    empObj: {
      empId: 3,
      empName: "Rose",
      country: "USA",
    },
  },
];

const result = data.map(({ name, desc, empObj }) => ({ name, desc, ...empObj, }));

console.log(result);

于 2021-07-29T05:49:31.613 回答
1

只需使用传播语法 (...).map()

const output = data.map(d => ({name: d.name, desc: d.desc, ...d.empObj}))

于 2021-07-29T05:50:11.890 回答