2016-05-02 11 views
1

は、私はこのような構造を有しているAPIからJSON配列を持っている:統合配列データ

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] 
} 
] 

私はオブジェクトが単一のオブジェクトに同じnameidを持つ配列を返すようにしたいです。

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

答えて

2

これは、Array#forEach()という単一ループの提案であり、挿入された項目を参照するヘルパーオブジェクトです。

出力はこの仕事のために切り出された入力 Array.prototype.reduce()の縮小版であり、非常にシンプルな「チェーン可能」コードを結果するので、私は、コメントで述べたように

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

。したがって、Arrayプロトタイプにコンストラクトを追加してわずかに変更すると、newArray.construct(e => somecode with e).filter(e => somecode with e).map(e => somecode with e)のようになります。これは関数型プログラミングにとって不可欠です。それをチェックアウト

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>");