我有以下javascript对象
const items = {
0: {
id: 1,
color: 'blue'
},
1: {
id: 2,
color: 'red'
}
}
我正在尝试对其进行重组,以使键具有如下所示的索引数字值: item1id , item1color , item2id , item2color 。或者更确切地说,它最终应该看起来像这样:
const restrucuturedItems = {
item1id: 1,
item1color: 'blue',
item2id: 2,
item2color: 'red'
}
我已经尝试了以下方法,但是到目前为止并未产生积极的结果:
const restrucuturedItems = {}; // should collect the restructured data in one object like so: {item1id: 1, item1color: 'blue', item2id:2, item2color: 'red'}
const restructuredData = Object.keys(items).forEach(key => {
let i = parseInt(key, 10) + 1;
let item = {
item[i]id: 1, // this part is incorrect. it should produce item1id, item2id
item[i]color: 'blue' // this part is incorrect. it should produce item1color, item2color
}
restrucuturedItems.push(item);
});
经过数小时的研究,我仍然不知道如何正确编写此部分。
答案 0 :(得分:0)
您不应使用push
,因为您希望restrucuturedItems
是对象,而不是数组。
将i
与id或颜色 放在方括号内,并使用 two Object.entries
-一个获取键和值外部对象中的每个对象,以及一个获取每个 inner 对象的键和值的对象:
const items = {
0: {
id: 1,
color: 'blue'
},
1: {
id: 2,
color: 'red'
}
}
console.log(Object.entries(items).reduce((a, [num, obj]) => {
Object.entries(obj).forEach(([key, val]) => {
a['item' + num + key] = val;
});
return a;
}, {}));
如果您真的想从item1id
开始而不是从item0id
开始,那么首先增加num
:
const items = {
0: {
id: 1,
color: 'blue'
},
1: {
id: 2,
color: 'red'
}
}
console.log(Object.entries(items).reduce((a, [num, obj]) => {
num++;
Object.entries(obj).forEach(([key, val]) => {
a['item' + num + key] = val;
});
return a;
}, {}));
答案 1 :(得分:0)
const items = {
0: {
id: 1,
color: 'blue'
},
1: {
id: 2,
color: 'red'
}
}
const restrucuturedItems = {}; // should collect the restructured data in one object like so: {item1id: 1, item1color: 'blue', item2id:2, item2color: 'red'}
const restructuredData = Object.keys(items).forEach(key => {
let i = parseInt(key, 10) + 1;
restrucuturedItems[`item${i}id`] = 1;
restrucuturedItems[`item${i}color`] = 'blue'
});
console.log(restrucuturedItems)
首先,您不能在对象上使用push
。 push
是用于数组的方法。其次,可以使用带有反引号的模板字符串来构造所需的属性名称
答案 2 :(得分:0)
reduce和map功能可以完成
var result = Object.values(items).reduce(function (r, val) { // get all the values
var prefix = 'item' + val.id; // construct the prefix like item1, item2
Object.getOwnPropertyNames(val).map(function(key) {
r[prefix + key] = val[key]; // add to the result object
});
return r;
}, {});