jQuery:根据另一个属性值对对象属性进行分组

时间:2016-03-24 09:14:19

标签: javascript 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值数组并创建一个新对象。

因此,处理后的最终结果将如下所示

[
  {"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是对象数组。我现在被困住了,不知道下一步该做什么。有没有更简单的方法来实现这一目标?

2 个答案:

答案 0 :(得分: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>');

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

现在迭代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 };
 });