[英]Add fields from array of JSON objects based on specific field
我有一系列对象...
[
{
"matchID":"-LP0LKl_nR4VQf6Gxwz8",
"playerId":"YvtwVY1gsZSzI7ZQzyDTZbSwdLF3",
"points":"11",
"id":"-LP1WvT4eN1L7BLbyhJt"
},
{
"matchID":"-LP0LKl_nR4VQf6Gxwz8",
"playerId":"YabcVY1gsZSzI7ZQzyDTZbSwdLF6",
"points":"23",
"id":"-TP1WvT4eN1L7GeYyhJt"
},
{
"matchID":"-DF0LKl_nR4VQf6Gxwz7",
"playerId":"YabcVY1gsZSzI7ZQzyDTZbSwdLF6",
"points":"12",
"id":"-GH1WvT4eN1L7GeYyhJt"
},
{
"matchID":"-DF0LKl_nR4VQf6Gxwz7",
"playerId":"YvtwVY1gsZSzI7ZQzyDTZbSwdLF3",
"points":"6",
"id":"-XZ1WvR2eN1L7GeYyhJt"
}
]
我想遍历此数组并创建一个新数组,该数组基本上只是每个玩家编号及其所有比赛的总分。
因此,经过上述循环之后,该数组将看起来像..
[{"palyerId": "YabcVY1gsZSzI7ZQzyDTZbSwdLF6", "points": "35"},{"palyerId": "YvtwVY1gsZSzI7ZQzyDTZbSwdLF3", "points": "17"}]
带有for循环的非简化版本如下所示(再次,中心思想是按playerId
):
let data = [{ "matchID": "-LP0LKl_nR4VQf6Gxwz8", "playerId": "YvtwVY1gsZSzI7ZQzyDTZbSwdLF3", "points": "11", "id": "-LP1WvT4eN1L7BLbyhJt" }, { "matchID": "-LP0LKl_nR4VQf6Gxwz8", "playerId": "YabcVY1gsZSzI7ZQzyDTZbSwdLF6", "points": "23", "id": "-TP1WvT4eN1L7GeYyhJt" }, { "matchID": "-DF0LKl_nR4VQf6Gxwz7", "playerId": "YabcVY1gsZSzI7ZQzyDTZbSwdLF6", "points": "12", "id": "-GH1WvT4eN1L7GeYyhJt" }, { "matchID": "-DF0LKl_nR4VQf6Gxwz7", "playerId": "YvtwVY1gsZSzI7ZQzyDTZbSwdLF3", "points": "6", "id": "-XZ1WvR2eN1L7GeYyhJt" } ]; var res = {}; for (let d of data) { if (d.playerId in res) res[d.playerId].points += parseInt(d.points); else res[d.playerId] = {playerId: d.playerId, points: parseInt(d.points)}; } console.log(Object.values(res));
您可以使用reduce()
遍历数组。 使用new Map()
对数组进行分组。 并使用传播运算符将地图对象转换为数组。
var arr = [{"matchID":"-LP0LKl_nR4VQf6Gxwz8","palyerId":"YvtwVY1gsZSzI7ZQzyDTZbSwdLF3","points":"11","id":"-LP1WvT4eN1L7BLbyhJt"},{"matchID":"-LP0LKl_nR4VQf6Gxwz8","palyerId":"YabcVY1gsZSzI7ZQzyDTZbSwdLF6","points":"23","id":"-TP1WvT4eN1L7GeYyhJt"},{"matchID":"-DF0LKl_nR4VQf6Gxwz7","palyerId":"YabcVY1gsZSzI7ZQzyDTZbSwdLF6","points":"12","id":"-GH1WvT4eN1L7GeYyhJt"},{"matchID":"-DF0LKl_nR4VQf6Gxwz7","palyerId":"YvtwVY1gsZSzI7ZQzyDTZbSwdLF3","points":"6","id":"-XZ1WvR2eN1L7GeYyhJt"}] var result = [...arr.reduce((c, v) => { if (!c.has(v.palyerId)) c.set(v.palyerId, {"palyerId": v.palyerId,"points": 0}); c.get(v.palyerId).points += +v.points; return c; }, new Map()).values()]; console.log(result);
或者,您可以使用palyerId
作为键将array reduce()
成为对象。 使用Object.values()
将对象转换为数组。
var arr = [{"matchID":"-LP0LKl_nR4VQf6Gxwz8","palyerId":"YvtwVY1gsZSzI7ZQzyDTZbSwdLF3","points":"11","id":"-LP1WvT4eN1L7BLbyhJt"},{"matchID":"-LP0LKl_nR4VQf6Gxwz8","palyerId":"YabcVY1gsZSzI7ZQzyDTZbSwdLF6","points":"23","id":"-TP1WvT4eN1L7GeYyhJt"},{"matchID":"-DF0LKl_nR4VQf6Gxwz7","palyerId":"YabcVY1gsZSzI7ZQzyDTZbSwdLF6","points":"12","id":"-GH1WvT4eN1L7GeYyhJt"},{"matchID":"-DF0LKl_nR4VQf6Gxwz7","palyerId":"YvtwVY1gsZSzI7ZQzyDTZbSwdLF3","points":"6","id":"-XZ1WvR2eN1L7GeYyhJt"}] var result = Object.values(arr.reduce((c, {palyerId,points}) => { c[palyerId] = c[palyerId] || {palyerId,points: 0}; c[palyerId].points += +points; return c; }, {})); console.log(result);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.