按ID对对象的Javascript数组进行分组

按ID对对象的Javascript数组进行分组,javascript,arrays,Javascript,Arrays,我想要实现的是,如果ID的前两位匹配,则将数组中的对象分组在一起。给定下面的对象数组,我想转换这个原始数组: [ { "id": "0100", "name": "name 1", "message": "Lorem blah blah 1" }, { "id": "0101", "name": "", "message": "Lorem blah blah 1.1"

我想要实现的是,如果ID的前两位匹配,则将数组中的对象分组在一起。给定下面的对象数组,我想转换这个原始数组:

[
    {
        "id": "0100",
        "name": "name 1",
        "message": "Lorem blah blah 1"
    },
    {
        "id": "0101",
        "name": "",
        "message": "Lorem blah blah 1.1"
    },
    {
        "id": "0200",
        "name": "name 2",
        "message": "Lorem blah blah 2"
    },
    {
        "id": "0201",
        "name": "",
        "message": "Lorem blah blah 2.1"
    },
    {
        "id": "0202",
        "name": "",
        "message": "Lorem blah blah 2.2"
    },
    {
        "id": "0300",
        "name": "name 3",
        "message": "Lorem blah blah 3"
    },
    {
        "id": "0301",
        "name": "",
        "message": "Lorem blah blah 3.1"
    },
    {
        "id": "0302",
        "name": "",
        "message": "Lorem blah blah 3.2"
    },
    {
        "id": "0303",
        "name": "",
        "message": "Lorem blah blah 3.3"
    },
    {
        "id": "0304",
        "name": "",
        "message": "Lorem blah blah 3.4"
    }
]
在这个新阵列中:

[
    {
        "id": "0100",
        "name": "name 1",
        "message": [
            "Lorem blah blah 1",
            "Lorem blah blah 1.1"
        ]
    },
    {
        "id": "0200",
        "name": "name 2",
        "message": [
            "Lorem blah blah 2",
            "Lorem blah blah 2.1",
            "Lorem blah blah 2.2"
        ]
    },
    {
        "id": "0300",
        "name": "name 3",
        "message": [
            "Lorem blah blah 3",
            "Lorem blah blah 3.1",
            "Lorem blah blah 3.2",
            "Lorem blah blah 3.3",
            "Lorem blah blah 3.4"
        ]
    }
]
需要注意的关键是,如果ID的前两位数字相同,则将这些对象中的消息添加到一起,如新数组中所示

正如大家所看到的,@Nenad Vracar对上述挑战给出了一个不错的答案,但是,我还有一个问题涉及到另一个阵列:

`var data2 = [{"CandidateName": "Mary", "relatedId": ["0100"]},{ "CandidateName": "John", "relatedId": ["0200"]},{ "CandidateName":"Peter", "relatedId": ["0300"]},{ "CandidateName": "Paul", "relatedId": ["0300"]}];`
在其中,我想提取'candidateName'并将其作为数组添加到原始数组“result”中

我在data1.reduce循环中尝试了data2.forEach循环,但它似乎挂起了

var result = data.reduce(function(r, el) {

  // THIS INNER LOOP MAKES THE BROWSER HANG!!!
  data2.forEach(function (a){
    console.log('a',a); 
  });

  var e = el.id.slice(0, 2);
  if (!o[e]) {
    o[e] = {
      id: el.id,
      name: el.name,
      message: []
    }
    r.push(o[e]);
  }
  o[e].message.push(el.message);
  return r;
}, [])
我想知道是否有一种更优雅、更复杂的方法不会中断?

您可以使用
reduce()
返回数组和一个对象进行分组

var data=[{“id”:“0100”,“name”:“name 1”,“message”:“Lorem blah blah 1”},{“id”:“0101”,“name”:“message”:“Lorem blah blah 1.1”},{“id”:“0200”,“name”:“name 2”,“message”:“Lorem blah blah 2”},{“id”:“0201”,“name”:“message”:“message”:“Lorem blah blah 2.1”},{“id”:“0202.2”,“name”:“message“Lorem blah blah 3”},{“id”:“0301”,“姓名”:“消息”:“Lorem blah blah 3.1”},{“id”:“0302”,“姓名”:“消息”:“Lorem blah blah 3.2”},{“id”:“0303”,“姓名”:“消息”:“Lorem blah blah 3.3”},{“id”:“0304”,“姓名”:“消息”:“Lorem blah blah 3.4”};
var o={}
var结果=数据减少(函数(r,el){
变量e=el.id.slice(0,2);
如果(!o[e]){
o[e]={
id:el.id,
姓名:el.name,
信息:[]
}
r、 推(o[e]);
}
o[e].message.push(el.message);
返回r;
}, [])
console.log(result)
您可以使用
reduce()
返回数组和一个对象进行分组

var data=[{“id”:“0100”,“name”:“name 1”,“message”:“Lorem blah blah 1”},{“id”:“0101”,“name”:“message”:“Lorem blah blah 1.1”},{“id”:“0200”,“name”:“name 2”,“message”:“Lorem blah blah 2”},{“id”:“0201”,“name”:“message”:“message”:“Lorem blah blah 2.1”},{“id”:“0202.2”,“name”:“message“消息”:“消息”:“id”:“0302”,“名称”:“消息”:“消息”:“消息”:“id”:“0302”,“名称”:“消息”:“消息”:“消息”:“消息”:“消息”:“消息”:“消息”:“消息”:“消息”:“消息”:“消息”:“消息”:“消息”:“消息”:“消息”:“消息”:“消息”:“消息”:“消息”:“消息”:“消息”:“消息”:“消息”:“消息”:“消息”:“消息”:“消息”:“消息”:“消息”:“消息”:;
var o={}
var结果=数据减少(函数(r,el){
变量e=el.id.slice(0,2);
如果(!o[e]){
o[e]={
id:el.id,
姓名:el.name,
信息:[]
}
r、 推(o[e]);
}
o[e].message.push(el.message);
返回r;
}, [])

console.log(result)
您可以检查双零并将新组添加到结果集中

var data=[{“id”:“0100”,“name”:“name 1”,“message”:“Lorem blah blah 1”},{“id”:“0101”,“name”:“message”:“Lorem blah blah 1.1”},{“id”:“0200”,“name”:“name 2”,“message”:“Lorem blah blah 2”},{“id”:“0201”,“name”:“message”:“message”:“Lorem blah blah 2.1”},{“id”:“0202”,“name”:“messageid:“0300”,“名称:”“名称3”,“消息:”“知识布拉赫布拉赫3”},{“id:”“0301”,“名称:”“消息:”“知识布拉赫3.1”},{“id:”“0302”,“名称:”“消息:”“知识布拉赫3.2”},{“id:”“0303”,“名称:”“消息:”“知识布拉赫3.3”},{“id:“0304”,“名称:”“消息:”“知识布拉赫3.4”},
分组=[];
data.forEach(函数(a){
var key=a.id.slice(0,2);
如果(a.id==key+'00'){
此[键]={id:a.id,name:a.name,消息:[]};
分组。按(此[键]);
}
此[key].message.push(a.message);
},Object.create(null));
console.log(分组);

。作为控制台包装{max height:100%!important;top:0;}
您可以检查双零并将新组添加到结果集中

var data=[{“id”:“0100”,“name”:“name 1”,“message”:“Lorem blah blah 1”},{“id”:“0101”,“name”:“message”:“Lorem blah blah 1.1”},{“id”:“0200”,“name”:“name 2”,“message”:“Lorem blah blah 2”},{“id”:“0201”,“name”:“message”:“message”:“Lorem blah blah 2.1”},{“id”:“0202”,“name”:“messageid:“0300”,“名称:”“名称3”,“消息:”“知识布拉赫布拉赫3”},{“id:”“0301”,“名称:”“消息:”“知识布拉赫3.1”},{“id:”“0302”,“名称:”“消息:”“知识布拉赫3.2”},{“id:”“0303”,“名称:”“消息:”“知识布拉赫3.3”},{“id:“0304”,“名称:”“消息:”“知识布拉赫3.4”},
分组=[];
data.forEach(函数(a){
var key=a.id.slice(0,2);
如果(a.id==key+'00'){
此[键]={id:a.id,name:a.name,消息:[]};
分组。按(此[键]);
}
此[key].message.push(a.message);
},Object.create(null));
console.log(分组);

.as console wrapper{max height:100%!important;top:0;}
这似乎是一个排序的数组如果我把这个问题作为一个新问题来问,我如何扩展这个问题而不失去动力?我可以在这里的评论中问我的问题吗?如果可以,我来寻求进一步的帮助。我还有另一个数组:
var data2=[{”CandidateName“:“Mary”,“relatedId:[“0100”]},{“CandidateName:“John”,“relatedId:[“0200”]},{“CandidateName:“Peter”,“relatedId:[“0300”]},{“CandidateName:“Paul”,“relatedId:[“0300”]}”
在其中,我想提取'candidateName'并将其作为数组添加到原始数组“result”中。我在data1.reduce循环中尝试了data2.forEach循环,但它似乎挂起了。我想知道是否有一个更优雅、更复杂的方法不会被打破?它似乎是一个有序的排列。如果我把这个问题作为一个新的问题来问,我如何在不失去动力的情况下扩展这个问题?我可以在这里的评论中问我的问题吗?如果是这样的话,我来寻求进一步的帮助。我有你