2016-03-24 13 views
0

私は次のようなオブジェクトの配列を持っています。jQuery:別のプロパティ値に応じたオブジェクトプロパティのグループ化

[ 
    {"rel_id": 1,"forward_flag": true,"asset_id":5,}, 
    {"rel_id": 1,"forward_flag": true,"asset_id":8}, 
    {"rel_id": 1,"forward_flag": false,"asset_id":3}, 
    {"rel_id": 2,"forward_flag": true,"asset_id":5,}, 
    {"rel_id": 2,"forward_flag": true,"asset_id":7,}, 
    {"rel_id": 2,"forward_flag": false,"asset_id":9,} 
] 

私はグループにプロパティrel_idforward_flagに基づいてオブジェクトをしようとしています。 rel_idforward_flagが同じオブジェクトについては、asset_idの配列を作成して新しいオブジェクトを作成しようとしています。

だから、一度に処理最終的な結果は、私がこのようにjQueryを使って同じことを達成しようとしてい

[ 
    {"rel_id":1,"forward_flag":true,"asset_id":[5,8]}, 
    {"rel_id":1,"forward_flag":false,asset_id:[3]}, 
    ... 
] 

のようになります。

preData.forEach(function(item){ 
    var first = item; 
     preData.forEach(function(compare){ 
      if(compare.rel_id != first.rel_id || compare.forwardFlag!= first.forwardFlag || compare.asset_id != first.assetid) //to make sure same item is not compared 
      { 
       if(compare.rel_id == first.rel_id && compare.forwardFlag == first.forwardFlag) 
       { 
        //do something here 
       } 
      } 
     }) 

    }) 

preDataはオブジェクトの配列です。私は今止まっていて、次に何をすべきか明確ではありません。これを達成するための簡単な方法はありますか?

+0

どのように 'rel_idを移入するrelsを繰り返す、このために別のオブジェクトを作成する必要があります'と' forward_flag'は同じものになるでしょうブール値と1つは数値です –

答えて

1

あなたはあなたのコード

var newArray = []; 
var rels = {}; 
preData.forEach(function(item){  
    var relForward = item.rel_id + "===" + item.forwardFlag; 
    if (!rels[ relForward ]) 
    { 
     rels[ relForward ] = []; 
    } 
    rels[ relForward ].push(item); 
}); 

を使用して

は今、最終的な出力newArray

newArray = Object.keys(rels).map(function(key){ 
    var item = rels[key][0]; 
    var assets = rels[key].map(function(value){ return value.asset_id; }); 
    return { rel_id : item.rel_id, forward_flag: item.forward_flag, asset_id: assets }; 
}); 
1

プレーンJavaScriptでは、Array#forEach()と新しい配列アイテムへの参照用の一時オブジェクトを使用できます。

var array = [{ "rel_id": 1, "forward_flag": true, "asset_id": 5, }, { "rel_id": 1, "forward_flag": true, "asset_id": 8 }, { "rel_id": 1, "forward_flag": false, "asset_id": 3 }, { "rel_id": 2, "forward_flag": true, "asset_id": 5, }, { "rel_id": 2, "forward_flag": true, "asset_id": 7, }, { "rel_id": 2, "forward_flag": false, "asset_id": 9, }], 
 
    grouped = function (array) { 
 
     var r = []; 
 
     array.forEach(function (a) { 
 
      var key = a.rel_id + '|' + a.forward_flag; 
 
      if (!this[key]) { 
 
       this[key] = { rel_id: a.rel_id, forward_flag: a.forward_flag, asset_id: [] }; 
 
       r.push(this[key]); 
 
      } 
 
      this[key].asset_id.push(a.asset_id); 
 
     }, {}); 
 
     return r; 
 
    }(array); 
 

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

関連する問題