Agrupar matriz de objetos Javascript por ID
O que eu quero alcançar é agrupar objetos dentro de uma matriz se os dois primeiros dígitos dos IDs corresponderem. Portanto, considerando a matriz de objetos abaixo, desejo converter essa ARRAY ORIGINAL:
[
{
"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"
}
]
neste novo arranjo:
[
{
"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"
]
}
]
O ponto principal a ser observado é que, se os dois primeiros dígitos dos IDs forem idênticos, adicione as mensagens nesses objetos, como visto no NEW ARRAY.
Como todos vocês podem ver, o @Nenad Vracar demonstrou uma resposta decente ao desafio acima, no entanto, tenho uma pergunta adicional envolvendo mais uma matriz:
`var data2 = [{"CandidateName": "Mary", "relatedId": ["0100"]},{ "CandidateName": "John", "relatedId": ["0200"]},{ "CandidateName":"Peter", "relatedId": ["0300"]},{ "CandidateName": "Paul", "relatedId": ["0300"]}];`
no qual eu quero puxar o 'candidatoName' e adicioná-lo como uma matriz à matriz original, "resultado".
Eu tentei um loop data2.forEach dentro do loop data1.reduce, mas parece travar.
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;
}, [])
Gostaria de saber se existe um método mais elegante e sofisticado que não irá quebrar?