2016-05-02 30 views
1

Ich habe eine JSON Array aus einem API, die die Struktur wie folgt hat:Konsolidieren von Arraydaten

newArray = [ 
{ 
"item":{"id":1, "name":"item1"}, 
"type": [1,2,3] 
}, 
{ 
"item":{"id":2, "name":"item2"}, 
"type": [4,5] 
}, 
{ 
"item":{"id":3, "name":"item3"}, 
"type": [8,9] 
}, 
{ 
"item":{"id":1, "name":"item1"}, 
"type": [11,12] 
}, 
{ 
"item":{"id":2, "name":"item3"}, 
"type": [31,41] 
}, 
{ 
"item":{"id":3, "name":"item3"}, 
"type": [11,23] 
} 
] 

Ich mag ein Array zurückzubringen mit Objekten in einem einzigen Objekt gleiche name und id aufweisen.

resultArray = [ 
{ 
"item":{"id":1, "name":"item1"}, 
"type": [1,2,3,11,12] 
}, 
{ 
"item":{"id":2, "name":"item2"}, 
"type": [4,5,31,41] 
}, 
{ 
"item":{"id":3, "name":"item3"}, 
"type": [8,9,11,23] 
}] 
+0

'Array.prototype.reduce()' – Redu

Antwort

2

Dies ist ein Einzelschleifen Vorschlag mit Array#forEach() und ein Helfer-Objekt für den Verweis auf ein Element eingefügt.

var newArray = [{ "item": { "id": 1, "name": "item1" }, "type": [1, 2, 3] }, { "item": { "id": 2, "name": "item2" }, "type": [4, 5] }, { "item": { "id": 3, "name": "item3" }, "type": [8, 9] }, { "item": { "id": 1, "name": "item1" }, "type": [11, 12] }, { "item": { "id": 2, "name": "item3" }, "type": [31, 41] }, { "item": { "id": 3, "name": "item3" }, "type": [11, 23] }], 
 
    resultArray = []; 
 

 
newArray.forEach(function (a) { 
 
    if (!this[a.item.id]) { 
 
     this[a.item.id] = { item: a.item, type: [] }; 
 
     resultArray.push(this[a.item.id]); 
 
    } 
 
    this[a.item.id].type = this[a.item.id].type.concat(a.type); 
 
}, Object.create(null)); 
 

 
document.write('<pre>' + JSON.stringify(resultArray, 0, 4) + '</pre>');

0

Wie ich im Kommentar erwähnt habe, da der Ausgang Array.prototype.reduce() eine reduzierte Version des Eingangssignals wird für diesen Job ausgeschnitten und ergibt einen sehr einfachen „verkettbare“ Code. Also, wenn Sie Konstrukt zu Array-Prototyp hinzufügen und leicht modifizieren, können Sie wie newArray.construct(e => somecode with e).filter(e => somecode with e).map(e => somecode with e) tun Dies ist wichtig für die funktionale Programmierung. Check it out

var newArray = [ 
 
{ 
 
"item":{"id":1, "name":"item1"}, 
 
"type": [1,2,3] 
 
}, 
 
{ 
 
"item":{"id":2, "name":"item2"}, 
 
"type": [4,5] 
 
}, 
 
{ 
 
"item":{"id":3, "name":"item3"}, 
 
"type": [8,9] 
 
}, 
 
{ 
 
"item":{"id":1, "name":"item1"}, 
 
"type": [11,12] 
 
}, 
 
{ 
 
"item":{"id":2, "name":"item3"}, 
 
"type": [31,41] 
 
}, 
 
{ 
 
"item":{"id":3, "name":"item3"}, 
 
"type": [11,23] 
 
} 
 
]; 
 

 
function construct(a){ 
 
    return a.reduce((p,c) => {var i = p.findIndex(e => e.item.id == c.item.id); 
 
          !!~i ? p[i].type = p[i].type.concat(c.type) : p.push(c); return p}, []); 
 
} 
 
document.write("<pre>" + JSON.stringify(construct(newArray),null,4) + "</pre>");

Verwandte Themen