Как плоский массив объектов в es6?

У меня есть массив объектов вроде. Я хочу извлечь вложенный объект и вернуть его, как ожидалось. Мой подход уже не работает, и я не уверен, что он эффективен для итерации большого набора данных.

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

но я получаю

Uncaught TypeError: невозможно преобразовать undefined или null в объект

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

console.log('expected', expected);

Спасибо

3 ответа

Решение

Вы можете легко добиться этого, используя карту

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

Используйте метод вместе с деструктуризацией и синтаксисом распространения и отдыха.

Мы можем добиться желаемого результата, разрушив ключ и собрав остальные свойства в каждом объекте в массиве, используя остальной синтаксис.

Внутри map() функция обратного вызова метода, вернуть новый объект, распространяя empObj а также другие свойства во вновь созданном объекте с использованием синтаксиса распространения.


Причина, по которой ваш код выдает ошибку, заключается в том, что data это массив, поэтому data.empObj не определено, и вы передаете это неопределенное значение в Object.keys(...) метод.

Просто используйте синтаксис Spread (...) и .map()

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

Другие вопросы по тегам