我有一个对象数组,如下所示。
[
{"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 :(得分: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 };
});