[英]How to merge multiple objects into one?
I am looking for a way to merge many objects with the same key to a one big object. 我正在寻找一种将具有相同键的许多对象合并到一个大对象的方法。 The number of objects can be more that 2.
对象数可以大于2。
For example I have this code: 例如,我有以下代码:
const a = {
en: {
hello: 'Hello'
},
fr: {
hello: 'Bonjour'
}
}
const b = {
en: {
goodbye: 'Goodbye'
},
fr: {
goodbye: 'Au revoir'
}
}
How to merge that into this: 如何将其合并为:
{
locale: 'en',
messages: {
en: {
hello: 'Hello',
goodbye: 'Goodbye'
},
fr: {
hello: 'Bonjour',
goodbye: 'Au revoir'
}
}
}
You could use a deep merge function for every level of the object. 您可以对对象的每个级别使用深度合并功能。
The function deepMerge
works as single function for a given target or as callback for Array#reduce
, where an array of objects is iterated and an empty object is supplied as startvalue
for reducing. 函数
deepMerge
可以作为给定目标的单个函数,也可以作为Array#reduce
回调函数,其中迭代对象数组,并提供一个空对象作为减少的startvalue
。
As result, you need a new object and assign the merges objects as new property messages
. 结果,您需要一个新对象,并将合并对象分配为新属性
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; }
Function mergeArray for array merging 函数mergeArray用于数组合并
const mergeArray = (firstArray, secondArray) => {
return {
locale: 'en',
messages: {
en: {
...firstArray.en,
...secondArray.en
},
fr: {
...firstArray.fr,
...secondArray.fr
}
}
}
};
console.log(mergeArray(a, b));
Below snippets give you expected output. 下面的代码片段为您提供了预期的输出。
const value = { locale: 'en', messages: { en: { ...a.en, ...b.en }, fr: { ...a.fr, ...b.fr } }};
console.log(value)
If you want it to a new object, you can use Object.Assign({}, a, b) 如果希望将其用于新对象,则可以使用Object.Assign({},a,b)
read this: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign 请阅读以下内容: https : //developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
Try this when the number of objects is dynamic: 当对象数是动态的时,请尝试以下操作:
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});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.