2016-03-24 4 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_id и forward_flag. Для тех объектов, чьи rel_id и forward_flag такие же, я пытаюсь создать массив значений asset_id и создать новый объект.

Так после обработки конечный результат будет выглядеть

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

Я пытался добиться того же с помощью JQuery, как это.

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 'и' forward_flag' будут одинаковыми, булевыми, а один - числом –

ответ

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

Теперь итерацию rels для заполнения окончательного вывода 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>');

Смежные вопросы