如何合并两个对象数组并连接值?

时间:2014-03-20 10:13:32

标签: javascript arrays underscore.js lodash

我有这两个对象数组

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
    }];

我需要合并这两个数组来得到类似的东西:

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

简单来说,我需要检查a.creazione == b.creazione然后合并密钥并连接数组中的值(结果的第一行),否则如果它不同,则在右侧分配现有数组的值y数组的位置(结果的第三行)。

PS:我需要得到这个结构,因为我使用Angular-Charts库,并且以这种不舒服的方式询问数据。

关于如何实现这一目标的任何想法?

2 个答案:

答案 0 :(得分:43)

请允许我用函数编程的力量来娱乐你:)

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

答案 1 :(得分:3)

使用纯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 ] } );
} );

小提琴:http://jsfiddle.net/rPk6e/

请注意,为简单起见,修改了订单数组。如果这是您的用例的问题,只需使用切片进行复制。