我正在寻找一种方法将许多对象与相同的键合并到一个大对象。对象的数量可以多于2。
例如,我有这个代码:
const a = {
en: {
hello: 'Hello'
},
fr: {
hello: 'Bonjour'
}
}
const b = {
en: {
goodbye: 'Goodbye'
},
fr: {
goodbye: 'Au revoir'
}
}
如何将其合并到此:
{
locale: 'en',
messages: {
en: {
hello: 'Hello',
goodbye: 'Goodbye'
},
fr: {
hello: 'Bonjour',
goodbye: 'Au revoir'
}
}
}
您可以为对象的每个级别使用深度合并功能。
函数deepMerge
作为给定目标的单个函数或作为Array#reduce
的回调,其中迭代一个对象数组,并提供一个空对象作为startvalue
进行缩减。
因此,您需要一个新对象并将合并对象指定为新属性messages
。
function deepMerge(target, source) {
Object.entries(source).forEach(([key, value]) => {
if (value && typeof value === 'object') {
deepMerge(target[key] = target[key] || {}, value);
return;
}
target[key] = value;
});
return target;
}
var a = { en: { hello: 'Hello' }, fr: { hello: 'Bonjour' } },
b = { en: { goodbye: 'Goodbye' }, fr: { goodbye: 'Au revoir' } },
c = { locale: 'en', messages: [a, b].reduce(deepMerge, {}) };
console.log(c);
.as-console-wrapper { max-height: 100% !important; top: 0; }
函数mergeArray用于数组合并
const mergeArray = (firstArray, secondArray) => {
return {
locale: 'en',
messages: {
en: {
...firstArray.en,
...secondArray.en
},
fr: {
...firstArray.fr,
...secondArray.fr
}
}
}
};
console.log(mergeArray(a, b));
片段下方为您提供预期的输出。
const value = { locale: 'en', messages: { en: { ...a.en, ...b.en }, fr: { ...a.fr, ...b.fr } }};
console.log(value)
如果你想要它到一个新对象,你可以使用Object.Assign({},a,b)
读这个:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
当对象数量是动态时尝试此操作:
var o, k, v, n, A=[a,b], r={}
for(o in A) for(k in A[o]) if(!r[k]) r[k]={};
for(o in A) for(v in A[o]) for(n in A[o][v]) if(!r[v][n]) r[v][n]= A[o][v][n];
console.log(r);
console.log({locale: 'en',messages:r});