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

How can I merge two array of objects and concatenate values?

本文关键字:数组 对象 连接 两个 何合并 合并      更新时间:2023-09-26

我有两个对象数组

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库,它以这种不舒服的方式请求数据。

有什么办法吗?

让我来给你讲讲函数式编程的威力吧:)

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

使用纯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/

注意,为了简单起见,顺序数组被修改了。如果这对您的用例来说是一个问题,只需使用slice进行复制。