Как плоский массив объектов в 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}))