Вы также можете решить эту проблему кратко, используя Array.reduce и ES6 :
let data = [ { "id": { "primary": "A1" }, "msg": 1 }, { "id": { "primary": "A1" }, "msg": 2 }, { "id": { "primary": "B2" }, "msg": 3 } ]
let result = data.reduce((r, {id, msg}) =>
((r[id.primary] = r[id.primary] || { id, items: [] }).items.push({msg}), r), {})
console.log(Object.values(result))
В более читаемом формате это:
let data = [ { "id": { "primary": "A1" }, "msg": 1 }, { "id": { "primary": "A1" }, "msg": 2 }, { "id": { "primary": "B2" }, "msg": 3 } ]
let result = data.reduce((r, {id, msg}) => {
r[id.primary] = (r[id.primary] || { id, items: [] })
r[id.primary].items.push({msg})
return r
}, {})
console.log(Object.values(result))
Идея состоит в том, чтобы сгруппировать по id.primary
, а затем, после того как группирование выполнено, просто получить значения через Object.values
Обратите внимание, что эторешение за один проход, при котором вам не нужно на каждую итерацию делать Array.find
против текущего аккумулятора.