如何使用 JavaScript 重构 json 对象



我需要重构 API 调用的输出,该调用返回的数据类似于以下内容:

{
"Label3":
[
{ "name": "superman", "power": 8900 },
{ "name": "iron man", "power": 3000 },
{ "name": "spike spiegal", "power": 200 },
{ "name": "doctor strange", "power": 800 }
],
"Label18":
[
{ "name": "goku", "power": 9000 },
{ "name": "vegeta", "power": 8500 },
{ "name": "pringles can", "power": 1 }
],
"Label37":
[
{ "name": "dr manhattan", "power": 100000 },
{ "name": "mayonaise", "power": 10 }
]
}

我需要它从每个数组中获取最高值,并创建一个新属性,例如称为 maxPower,并进行一些重组以返回如下数据:

{
"groupName": 'Label3',
"highestPower": 8900,
"heroes": [
{"name":"superman","power":8900},
{"name":"iron man","power":3000},
{"name":"spike spiegal","power":200},
{"name":"doctor strange","power":800}
],
},
{
"groupName": 'Label18',
"highestPower": 9000,
"heroes": [
{"name":"goku","power":9000},
{"name":"vegeta","power":8500},
{"name":"pringles can","power":1}
],
},
{
"groupName": 'Label37',
"highestPower": 100000,
"heroes": [
{"name":"dr manhattan","power":100000},
{"name":"mayonaise","power":10}
],
}

我正在考虑在每个数组上执行 forEach,并获取第二个索引并设置为一个变量并进行比较,只是不确定如何通过数据重组来实现这一点。

您可以获取条目并使用所需的属性构建一个新对象。

var data = { Label3: [{ name: "superman", power: 8900 }, { name: "iron man", power: 3000 }, { name: "spike spiegal", power: 200 }, { name: "doctor strange", power: 800 }], Label18: [{ name: "goku", power: 9000 }, { name: "vegeta", power: 8500 }, { name: "pringles can", power: 1 }], Label37: [{ name: "dr manhattan", power: 100000 }, { name: "mayonaise", power: 10 }] },
result = Object
.entries(data)
.map(([groupName, heroes]) => ({
groupName,
highestPower: heroes.reduce((max, { power }) => Math.max(max, power), -Infinity),
heroes
}));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

您可以使用Object.keys()循环访问标签和Array.reduce以获得最高功率,如下所示:

var labels = {
"Label3":
[
{ "name": "superman", "power": 8900 },
{ "name": "iron man", "power": 3000 },
{ "name": "spike spiegal", "power": 200 },
{ "name": "doctor strange", "power": 800 }
],
"Label18":
[
{ "name": "goku", "power": 9000 },
{ "name": "vegeta", "power": 8500 },
{ "name": "pringles can", "power": 1 }
],
"Label37":
[
{ "name": "dr manhattan", "power": 100000 },
{ "name": "mayonaise", "power": 10 }
]
}
var groupedLabels = Object.keys(labels).map((key) => {
return {
groupName: key,
highestPower: labels[key].reduce(( acc, cur ) => Math.max( acc, cur.power ), 0),
heroes: labels[key]
}
});
console.log(groupedLabels);

如果源已排序:

var src = obj();
var dst = [];
for(var i in src) {
dst.push({
"groupName":i,
"highestPower":src[i][0].power,
"heros":src[i]
});
}
console.log( JSON.stringify(dst,null,2) );
function obj() {
return {
"Label3":
[
{ "name": "superman", "power": 8900 },
{ "name": "iron man", "power": 3000 },
{ "name": "spike spiegal", "power": 200 },
{ "name": "doctor strange", "power": 800 }
],
"Label18":
[
{ "name": "goku", "power": 9000 },
{ "name": "vegeta", "power": 8500 },
{ "name": "pringles can", "power": 1 }
],
"Label37":
[
{ "name": "dr manhattan", "power": 100000 },
{ "name": "mayonaise", "power": 10 }
]
};
}

最新更新