How can I merge two array of objects and concatenate values?
12,188
Solution 1
Using plain JavaScript:
var result = [];
client.forEach( function( entry ) {
for( var i = 0; i < order.length; ++i ) {
if( entry.creazione === order[i].creazione ) {
result.push( { x: entry.creazione, y: [ entry.value, order[i].value ] } );
order.splice( i, 1 );
return;
}
}
result.push( { x: entry.creazione, y: [ entry.value, 0 ] } );
} );
order.forEach( function( entry ) {
result.push( { x: entry.creazione, y: [ 0, entry.value ] } );
} );
Fiddle: http://jsfiddle.net/rPk6e/
Note that for simplicity the order array is modified. If that is a problem for your use case simply make a copy using slice.
Solution 2
Allow me to amuse you with the power of functional programming :)
client = _.object(_.map(client, _.values));
order = _.object(_.map(order , _.values));
var result = _
.chain(_.keys(client))
.union(_.keys(order))
.map(function (key) {
return [key, [client[key] || 0, order[key] || 0]];
})
.map(_.partial(_.zipObject, ['x', 'y']))
.value();
console.log(result);
# [ { x: '1970-01-01', y: [ 2, 1 ] },
# { x: '2014-03-12', y: [ 4, 0 ] },
# { x: '2014-03-14', y: [ 1, 1 ] },
# { x: '2014-03-13', y: [ 0, 5 ] } ]
Related videos on Youtube
Author by
teone
Updated on September 15, 2022Comments
-
teone over 1 year
I have this two array of objects
var client = [{ "creazione": "1970-01-01", "value": 2 }, { "creazione": "2014-03-12", "value": 4 }, { "creazione": "2014-03-14", "value": 1 }], order = [{ "creazione": "1970-01-01", "value": 1 }, { "creazione": "2014-03-13", "value": 5 }, { "creazione": "2014-03-14", "value": 1 }];
I need to merge these two arrays to get something like:
[{ x: '1970-01-01', y: [2, 1] }, { x: '2014-03-12', y: [4, 0] }, { x: '2014-03-14', y: [1, 1] }, { x: '2014-03-13', y: [0, 5] }]
In few words I need to check if
a.creazione == b.creazione
then merge the key and concat the values in an array (first line of result), else if it is different, assign the value of the existing array in the right position of they
array (third line of result).PS: I need to get this structure beacuse I'm using Angular-Charts library, and it ask for data in this uncomfortable way.
Any idea on how to achieve this?