Сделать из одного массива другой с изменением ключей Object.entries
Есть изначальный массив вида:
[
{
"id":1287,
"name":"name1",
"params":[
{
"param1":"10",
"type":"UInt32"
},
{
"param2":"30",
"type":"UInt16"
}
]
},
{
"id":1288,
"name":"name2 ",
"params":[
{
"param3":"20",
"type":"Date"
},
{
"param4":"34",
"type":"String"
},
{
"param5":"15",
"type":"UInt8"
}
]
}
]
Его надо перевести в массив вида:
[
{
"id":1287,
"name":"name1",
"params":[
{
"name":"name1",
"key":"param1",
"value":"10",
"type":"UInt32"
},
{
"name":"name1",
"key":"param2",
"value":"30",
"type":"UInt32"
}
]
},
{
"id":1288,
"name":"name2",
"params":[
{
"name":"name2",
"key":"param3",
"value":"20",
"type":"UInt32"
},
{
"name":"name2",
"key":"param4",
"value":"34",
"type":"UInt32"
},
{
"name":"name2",
"key":"param5",
"value":"15",
"type":"UInt32"
}
]
}
]
Была попытка для переведения "param1": 10 в "key":"param1","value":"10" использовать map и Object.entries, но не получается привести все к нужному виду и добавить в новые объекты внутри params внешний name.
Подскажите, какое решение тут было бы лучше?
Ответы (2 шт):
Автор решения: Qwertiy
→ Ссылка
var a = [ { "id":1287, "name":"name1", "params":[ { "param1":"10", "type":"UInt32" }, { "param2":"30", "type":"UInt16" } ] }, { "id":1288, "name":"name2 ", "params":[ { "param3":"20", "type":"Date" }, { "param4":"34", "type":"String" }, { "param5":"15", "type":"UInt8" } ] } ]
console.log(a.map(x => ({
...x,
params: x.params.map(p => {
var keys = Object.keys(p).filter(k => k !== 'type')
if (keys.length !== 1) throw new Error("Invalid number of keys")
return {
name: x.name,
key: keys[0],
value: p[keys[0]],
type: p.type,
}
}),
})))
.as-console-wrapper.as-console-wrapper { max-height: 100vh }
Автор решения: vsemozhebuty
→ Ссылка
Если можно менять исходную структуру:
const data = [
{
"id":1287,
"name":"name1",
"params":[
{
"param1":"10",
"type":"UInt32"
},
{
"param2":"30",
"type":"UInt16"
}
]
},
{
"id":1288,
"name":"name2 ",
"params":[
{
"param3":"20",
"type":"Date"
},
{
"param4":"34",
"type":"String"
},
{
"param5":"15",
"type":"UInt8"
}
]
}
];
for (const item of data) {
item.params.forEach((param, i, params) => {
const [key, value] = Object.entries(param).find(
([k]) => k.startsWith('param')
);
params[i] = {
name: item.name,
key: key,
value: value,
type: 'UInt32',
};
});
}
console.log(JSON.stringify(data, null, ' '));