使用相同的键值分配和合并多个嵌套对象

时间:2017-12-21 12:49:50

标签: javascript object assign

我正在迭代可能具有相同键的对象,例如:

let data = {};
// object 1
metadata:{
  datefrom: '2001'
}
// objeft 2
metadata:{
  dateto: '2002'
}

因此,在迭代时,它们具有相同的变量名objDataEl

我正在尝试将它们分配给data对象,但问题是只分配了最后一个。

我试过这样做:

data = Object.assign(data, objDataEl);

// strDataKey is = 'metadata'
data[strDataKey] = objDataEl;

但是在这两种情况下它都被覆盖了,只有最后一个值被插入到对象中。

在尝试后,它应该是这样的:

data: {
  metadata: {
    datefrom: '2001',
    dateto: '2002'
  }
}

数据结构如下所示:

data = [ { "metadata" : { "datefrom" : 2001 } }, { "metadata" : { "dateto" : 2015 } } ];

如何实现这一目标?

1 个答案:

答案 0 :(得分:1)

简单的数组缩减就可以了。



        var mergeProperty = function mergeProperty( propertyName ) {
            return function( aggregation, record ) {
                aggregation[ propertyName ] = Object.assign( aggregation[ propertyName ] || {}, record[ propertyName ] );
                return aggregation;
            };
        };
        var data = [
            { "metadata" : { "datefrom" : 2001 } },
            { "metadata" : { "dateto" : 2015 } }
        ];
        var result = data.reduce( mergeProperty( 'metadata' ), {} );
        // ES6
        const mergePropertyES6 = propertyName => ( aggregation, record ) => {
            aggregation[ propertyName ] = Object.assign( aggregation[ propertyName ] || {}, record[ propertyName ] );
            return aggregation;
        };
        const dataES6 =  [
            { "metadata" : { "datefrom" : 2001 } },
            { "metadata" : { "dateto" : 2015 } }
        ];
        const resultES6 = dataES6.reduce( mergePropertyES6( 'metadata' ), {} );
        console.log( result );
        console.log( resultES6 );