我有一个输入对象数组,每个对象都具有以下格式:
{
titleID: string,
titleName: string,
1af23_red: number,
45ua6_blue: number
}
我知道的是:
在每个对象中,总是键
titleID
和titleName
然后我会有几个键具有格式number_string
。titleID
和titleName
值在不同的对象之间会有所不同其余键(1af23_red、45ua6_blue 等)在所有对象中都相同,并且它们都具有相同的格式“id_name” 因此,如果第一个对象将 1af23_red 和 45ua6_blue 作为键,所有其余的也将只有这些 key 。
我想要返回的数组类型具有以下格式:
{
color: {
id
name
},
data: Array<
{
title: {
id
name
},
rating
}
>
}
因此,输入示例:
[
{
titleId: 'a',
titleName: 'atitle',
'1af_red': 50
'ba2_blue': 40
},
{
titleId: 'b',
titleName: 'btitle',
'1af_red': 30
'ba2_blue': null
},
{
titleId: 'c',
titleName: 'ctitle',
'1af_red': null
'ba2_blue': 10
}
]
我希望得到返回:
[
{
color: {
id: '1af',
name: 'red'
},
data: [
{
title: {
id: 'a',
name: 'atitle',
},
rating: 50
},
{
title: {
id: 'b',
name: 'btitle',
},
rating: 30
},
{
title: {
id: 'c',
name: 'ctitle',
},
rating: null
}
]
},
{
color: {
id: 'ba2',
name: 'blue'
},
data: [
{
title: {
id: 'a',
name: 'atitle',
},
rating: 40
},
{
title: {
id: 'b',
name: 'btitle',
},
rating: null
},
{
title: {
id: 'c',
name: 'ctitle',
},
rating: 10
}
]
}
]
我尝试过使用 map 和 reduce 进行这种转换,但我被卡住了。有没有一种简单的方法可以做到这一点?
最佳答案
给你。
简要逻辑:从数据数组的第 0 个索引处获取对象的所有键。遍历键,如果键包含'_',选择键,将其分解以形成 id 和 name 对,然后映射所有数据对象,获取该键的分数并将其附加到具有 id 和 name 值的对象.最后将此对象附加到结果数组。对所有包含“_”的键执行此操作。
const data = [
{
titleId: 'a',
titleName: 'atitle',
'1af_red': 50,
'ba2_blue': 40
},
{
titleId: 'b',
titleName: 'btitle',
'1af_red': 30,
'ba2_blue': null
},
{
titleId: 'c',
titleName: 'ctitle',
'1af_red': null,
'ba2_blue': 10
}
];
const keys = Object.keys(data[0]);
const result = []
keys.map(key=> {
if(key.indexOf('_')!==-1){
const item = {}
const keyData = key.split('_')
item.color = {
id : keyData[0],
name : keyData[1]
}
item.data = []
data.map(obj => {
const newObj = {}
newObj.title = {
id : obj.titleId,
name : obj.titleName
}
newObj.rating = obj[key];
item.data.push(newObj);
});
result.push(item);
}
});
console.log(result);
关于javascript - 在 Javascript 中转换对象格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54709262/