根据特定字段从JSON对象数组添加字段

时间:2018-10-25 14:51:48

标签: javascript arrays

我有一个对象数组...

[  
   {  
      "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"
   }
]

我想遍历此数组并创建一个新数组,该数组基本上只是每个玩家ID及其所有比赛的总分。

因此,循环浏览上述内容后,数组将看起来像..

 [{"palyerId": "YabcVY1gsZSzI7ZQzyDTZbSwdLF6", "points": "35"},{"palyerId": "YvtwVY1gsZSzI7ZQzyDTZbSwdLF3", "points": "17"}]

2 个答案:

答案 0 :(得分:2)

带有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));

答案 1 :(得分:2)

您可以使用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);


或者您可以reduce()作为键,将数组palyerId 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);将对象转换为数组。

 x<-1
 vec<-c()
 while(x<11){
   x<-x+1
   vec<-c(vec,x)
 }
 vec
 [1]  2  3  4  5  6  7  8  9 10 11