首页 > 解决方案 > 基于javascript中的多个键对数据进行分组

问题描述

收到 JSON 响应

[{
    "name": "A1",
    "date": "2019-03-13",
    "comment": "xyz"
  },
  {
    "name": "A1",
    "date": "2019-03-13",
    "comment": "abc"
  },
  {
    "name": "B1",
    "date": "2019-03-13",
    "comment": "pqr"
  },
  {
    "name": "A1",
    "date": "2019-03-14",
    "comment": "mno"
  }
]

预期产出

[
  {
    "name": "A1",
    "date": "2019-03-13",
    "data": [
      {
        "name": "A1",
        "date": "2019-03-13",
        "comment": "xyz"
      },
      {
        "name": "A1",
        "date": "2019-03-13",
        "comment": "abc"
      }
    ],
    {
      "name": "A1",
      "date": "2019-03-14",
      "data": [
        {
          "name": "A1",
          "date": "2019-03-14",
          "comment": "mno"
        }
      ]
    },
    {
      "name": "B1",
      "date": "2019-03-13",
      "data": [
        {
          "name": "B1",
          "date": "2019-03-13",
          "comment": "pqr"
        }
      ]
    }
  ]

我想创建包含唯一名称和日期及其各自数据的新 javascript 数组。

有人可以在这里帮助我吗?

标签: javascriptarrays

解决方案


您可以根据对象累加器中的&array#reduce对日期进行分组,然后使用.namedateObject.values()

let data = [{ "name": "A1", "date": "2019-03-13", "comment": "xyz" }, { "name": "A1", "date": "2019-03-13", "comment": "abc" }, { "name": "B1", "date": "2019-03-13", "comment": "pqr" }, { "name": "A1", "date": "2019-03-14", "comment": "mno" } ],
    result = Object.values(data.reduce((r,{name,date, comment}) => {
      r[name + "_" + date] = r[name + "_" + date] || {name, date, data: []};
      r[name + "_" + date].data.push({name,date,comment});
      return r;
    },{}));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }


推荐阅读