[英]JavaScript - Flatten Array of Nested Objects
我正在处理对象数组,需要使用对象值作为新的对象键来展平并将数据集重新分配为单个对象的数组。
传入数据:
results = [
{
surveyValues: [
{ id: 135, name: 'First Name', value: 'Jim' },
{ id: 136, name: 'Last Name', value: 'Jones' },
{ id: 137, name: 'City', value: 'Fredsburg' },
],
},
{
surveyValues: [
{ id: 135, name: 'First Name', value: 'Greg' },
{ id: 136, name: 'Last Name', value: 'Jones' },
{ id: 137, name: 'City', value: 'Waverly' },
],
},
];
所需结果:
output = [
{
id: 1, FirstName: 'Jim', LastName: 'Jones', City: 'Fredsburg',
},
{
id: 2, FirstName: 'Greg', LastName: 'Jones', City: 'Waverly',
},
];
我目前的尝试是让我以正确的顺序放置更新的键/值对,但是创建了大量的单个对象。
当前代码:
const results = [];
surveyResults.map(s => s.surveyValues)
.forEach(s => Object.entries(s)
.forEach(([key, value]) => {
Object.entries(value)
.forEach(([k, v]) => {
if (k === 'name') {
results.push({
id: value.id,
[v]: value.value.toString(),
});
}
});
}));
当前代码输出:
[
{
id: 135, FirstName: 'Jim',
},
{
id: 136, LastName: 'Jones',
},
{
id: 137, City: 'Fredsburg',
},
{
id: 135, FirstName: 'Greg',
},
{
id: 136, LastName: 'Jones',
},
{
id: 137, City: 'Waverly',
},
]
我缺少什么,为什么我的代码未按需要创建新的对象数组?
您可以使用map
和reduce
来实现。 我还在地图函数的回调中访问索引i
,以设置id属性和string.replace()
来从FirstName
和LastName
键中删除空格。
const results = [ { surveyValues: [ { id: 135, name: 'First Name', value: 'Jim' }, { id: 136, name: 'Last Name', value: 'Jones' }, { id: 137, name: 'City', value: 'Fredsburg' }, ], }, { surveyValues: [ { id: 135, name: 'First Name', value: 'Greg' }, { id: 136, name: 'Last Name', value: 'Jones' }, { id: 137, name: 'City', value: 'Waverly' }, ], }, ]; const result = results.map((e, i) => e.surveyValues.reduce((a, e) => { a[e.name.replace(" ", "")] = e.value; return a; }, {id: i + 1}) ); console.log(result);
在外部map()
循环中创建每个对象,并在内部的forEach()
向其添加属性。
surveyResults = [ { surveyValues: [ { id: 135, name: 'First Name', value: 'Jim' }, { id: 136, name: 'Last Name', value: 'Jones' }, { id: 137, name: 'City', value: 'Fredsburg' }, ], }, { surveyValues: [ { id: 135, name: 'First Name', value: 'Greg' }, { id: 136, name: 'Last Name', value: 'Jones' }, { id: 137, name: 'City', value: 'Waverly' }, ], }, ]; const results = surveyResults.map((s, i) => { let v = s.surveyValues; let obj = {id: i}; v.forEach(item => obj[item.name.replace(/\\s+/g, "")] = item.value.toString()); return obj; }); console.log(results);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.