user6064424
user6064424

Reputation:

Process this array of objects and combine some into one

I have this object.

var orig_array =   [
    { "MSG_ID": { "lgth": "1", "payload": 0 } },
    { "STATE_1": { "lgth": "1", "payload": "XX" } },
    { "STATE_2": { "lgth": "1", "payload": "XXX" } },
    { "MSG_ID": { "lgth": "1", "payload": 1 } },
    { "STATE_1": { "lgth": "1", "payload": "X" } },
    { "STATE_2": { "lgth": "1", "payload": "XX" } },
    { "STATE_3": { "lgth": "6", "payload": "XXX" } },
    { "MSG_ID": { "lgth": "1", "payload": 2 } },
    { "STATE_1": { "lgth": "1", "payload": "XXXX" } }
];

I want to reduce the number of objects by grouping a few related objects into a single one.

The resulting array should look like this;

var processed_array =   [
    { "MSG_ID": { "lgth": "1", "payload": 0 }, "STATE_1": { "lgth": "1", "payload": "XX" },"STATE_2": { "lgth": "1", "payload": "XXX" } },
    { "MSG_ID": { "lgth": "1", "payload": 1 },"STATE_1": { "lgth": "1", "payload": "X" },"STATE_2": { "lgth": "1", "payload": "XX" },"STATE_3": { "lgth": "6", "payload": "XXX" } },
    { "MSG_ID": { "lgth": "1", "payload": 2 },"STATE_1": { "lgth": "1", "payload": "XXXX" } }
];

In orig_array, there are 3 objects with "MSG_ID". The subsequent "STATE_X" objects are combined into the above "MSG_ID" object. I have been staring at this problem for some time. Anyone can help or give some hints as a head-start?

Upvotes: 3

Views: 138

Answers (4)

Jack jdeoel
Jack jdeoel

Reputation: 4584

You can do with many js function eg.sort,map,forEach ...etc .I tried with my prefer function .sort

    i = -1;
    processed_array = [];
    orig_array.sort(function (r) {
        var k = Object.keys(r)[0];        
        if(k === "MSG_ID"){          
          i++;
          processed_array.push({});
        }
        processed_array[i][k] = r[k];
        return processed_array;
    }); 
console.log(processed_array);

Upvotes: 2

Morteza Tourani
Morteza Tourani

Reputation: 3536

I think this would be the correct answer

var orig_json = [{
  "MSG_ID": { "lgth": "1", "payload": 0 }
}, {
  "STATE_1": { "lgth": "1", "payload": "XX" }
}, {
  "STATE_2": { "lgth": "1", "payload": "XXX" }
}, {
  "MSG_ID": { "lgth": "1", "payload": 1 }
}, {
  "STATE_1": { "lgth": "1", "payload": "X" }
}, {
  "STATE_2": { "lgth": "1", "payload": "XX" }
}, {
  "STATE_3": { "lgth": "6", "payload": "XXX" }
}, {
  "MSG_ID": { "lgth": "1", "payload": 2 }
}, {
  "STATE_1": { "lgth": "1", "payload": "XXXX" }
}];

var out = [],
  group = {};

orig_json
  .reduce((p, c) => p.concat(
    Object.keys(c).map(k => ({
      key: k,
      value: c[k]
    }))
  ), []).forEach(v => {
    if (v.key === "MSG_ID") {
      group = {};
      out.push(group);
    }
    group[v.key] = v.value
  });
console.log(out)

Upvotes: 2

Morteza Tourani
Morteza Tourani

Reputation: 3536

I Think you need a groupBy method:

Array.prototype.groupBy = function(expresion) {
  var collection = [];
  this.forEach((v, i, a) => {
    var key = expresion(v, i, a);
    var group = collection.find(g => g.key === key);
    if (!group) {
      group = [];
      group.key = key;
      collection.push(group);
    }
    group.push(v);
  });

  return collection;
};

var orig_json = [{
  "MSG_ID": { "lgth": "1", "payload": 0 }
}, {
  "STATE_1": { "lgth": "1", "payload": "XX" }
}, {
  "STATE_2": { "lgth": "1", "payload": "XXX" }
}, {
  "MSG_ID": { "lgth": "1", "payload": 1 }
}, {
  "STATE_1": { "lgth": "1", "payload": "X" }
}, {
  "STATE_2": { "lgth": "1", "payload": "XX" }
}, {
  "STATE_3": { "lgth": "6", "payload": "XXX" }
}, {
  "MSG_ID": { "lgth": "1", "payload": 2 }
}, {
  "STATE_1": { "lgth": "1", "payload": "XXXX" }
}];

var newObj =orig_json
  .reduce((p, c) => p.concat(Object.keys(c).map(k => c[k])), [])
  .groupBy(v => Object.keys(v)[0]);
console.log(newObj);

Upvotes: 1

Nina Scholz
Nina Scholz

Reputation: 386560

You could use Array#reduce and look for 'MSG_ID' as a group change.

var array = [{ "MSG_ID": { "lgth": "1", "payload": 0 } }, { "STATE_1": { "lgth": "1", "payload": "XX" } }, { "STATE_2": { "lgth": "1", "payload": "XXX" } }, { "MSG_ID": { "lgth": "1", "payload": 1 } }, { "STATE_1": { "lgth": "1", "payload": "X" } }, { "STATE_2": { "lgth": "1", "payload": "XX" } }, { "STATE_3": { "lgth": "6", "payload": "XXX" } }, { "MSG_ID": { "lgth": "1", "payload": 2 } }, { "STATE_1": { "lgth": "1", "payload": "XXXX" } }],
    grouped = array.reduce(function (r, a) {
        var key = Object.keys(a)[0];
        if (key === 'MSG_ID') {
            r.push({});
        }
        r[r.length - 1][key] = a[key];
        return r;
    }, []);

console.log(grouped);

Upvotes: 5

Related Questions