javascript中基于多个键的分组数据

javascript中基于多个键的分组数据,javascript,arrays,Javascript,Arrays,收到JSON响应 [{ “名称”:“A1”, “日期”:“2019-03-13”, “注释”:“xyz” }, { “名称”:“A1”, “日期”:“2019-03-13”, “评论”:“abc” }, { “名称”:“B1”, “日期”:“2019-03-13”, “评论”:“pqr” }, { “名称”:“A1”, “日期”:“2019-03-14”, “评论”:“mno” } ] 预期产量 [ { "name": "A1", "date": "2019-03-13",

收到JSON响应

[{
“名称”:“A1”,
“日期”:“2019-03-13”,
“注释”:“xyz”
},
{
“名称”:“A1”,
“日期”:“2019-03-13”,
“评论”:“abc”
},
{
“名称”:“B1”,
“日期”:“2019-03-13”,
“评论”:“pqr”
},
{
“名称”:“A1”,
“日期”:“2019-03-14”,
“评论”:“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数组,其中包含唯一的名称和日期及其相应的数据

有人能帮我吗?

您可以使用
数组#根据对象累加器中的
名称
日期
缩减为组日期,然后使用
对象.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”},
结果=Object.values(data.reduce((r,{name,date,comment})=>{
r[name+“”+日期]=r[name+“”+日期]|{名称、日期、数据:[]};
r[name+“”+date].data.push({name,date,comment});
返回r;
},{}));
控制台日志(结果)

.as console wrapper{max height:100%!important;top:0;}
您可以获取所需分组的数组并查找对象

var数据=[{name:“A1”,日期:“2019-03-13”,注释:“xyz”},{name:“A1”,日期:“2019-03-13”,注释:“abc”},{name:“B1”,日期:“2019-03-13”,注释:“pqr”},{name:“A1”,日期:“2019-03-14”,注释:“mno”},
groupBy=['name','date'],
分组=数据。减少((r,o)=>{
var temp=r.find(p=>groupBy.every(k=>o[k]==p[k]);
如果(!temp){
r、 push(temp=Object.assign(…groupBy.map(k=>({[k]:o[k]})),{data:[]});
}
温度数据推送(o);
返回r;
}, []);
控制台日志(分组)

。作为控制台包装{max height:100%!important;top:0;}
您可以使用
reduce
收集值:

var输入=[{
“名称”:“A1”,
“日期”:“2019-03-13”,
“注释”:“xyz”
},
{
“名称”:“A1”,
“日期”:“2019-03-13”,
“评论”:“abc”
},
{
“名称”:“B1”,
“日期”:“2019-03-13”,
“评论”:“pqr”
},
{
“名称”:“A1”,
“日期”:“2019-03-14”,
“评论”:“mno”
}
]
var res=input.reduce((acc,{name,date,comment})=>{
var found=acc.find(el=>el.name==name&&el.date==date);
返回发现
?found.data.push({name,date,comment})和&acc
:[…acc,{name,date,data:[{name,date,comment}]}];
}, []);

log(JSON.stringify(res))一种简单的方法:

const数据=[{
“名称”:“A1”,
“日期”:“2019-03-13”,
“注释”:“xyz”
},
{
“名称”:“A1”,
“日期”:“2019-03-13”,
“评论”:“abc”
},
{
“名称”:“A1”,
“日期”:“2019-03-13”,
“注释”:“fffffffff”
},
{
“名称”:“B1”,
“日期”:“2019-03-13”,
“评论”:“pqr”
},
{
“名称”:“B1”,
“日期”:“2019-03-13”,
“评论”:“HHHHHHHHHHHH”
},
{
“名称”:“A1”,
“日期”:“2019-03-14”,
“评论”:“mno”
}
]
const res=数据减少((全部,acc)=>{
const found=all.find(o=>o.name==acc.name&&o.date==acc.date)
如果(找到===未定义){
所有。推送(acc)
}否则{
found.data=(found.data | |[]).concat(acc)
}
全部归还;
}, [])

console.log(res)
为什么要重复数据?与您如此快速的回答相比,我花了更多的时间发布这个问题。非常感谢!!!