0

I have a array of object that looks like the following.

[
  {"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,}
]

I'm trying to group the object based on the properties rel_id and forward_flag . For those objects whose rel_id and forward_flag are same , I'm trying to create an array of asset_id values and make a new object.

So once processed end result will look like

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

I have tried to achieve the same using jQuery like this.

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

  })

where preData is the array of objects. I'm stuck now, and not clear what to do next. Are there any easier ways to achieve this?

1
  • how rel_id and forward_flag are going to be same one is boolean and one is number Commented Mar 24, 2016 at 9:20

2 Answers 2

1

You need to make another object for this,

Using your code

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

Now iterate rels to populate final output 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 };
 });
Sign up to request clarification or add additional context in comments.

Comments

1

In plain Javascript, you can use Array#forEach() and a temporary object for the reference to the new array items.

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.