分配和合并具有相同键值的多个嵌套对象
Assigning and merging multiple nested objects with same key value
我正在遍历可能具有相同键的对象,例如:
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 } } ];
如何实现?
一个简单的数组缩减就可以解决问题。
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 );
我正在遍历可能具有相同键的对象,例如:
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 } } ];
如何实现?
一个简单的数组缩减就可以解决问题。
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 );