簡體   English   中英

如何將多個對象合並為一個?

[英]How to merge multiple objects into one?

我正在尋找一種將具有相同鍵的許多對象合並到一個大對象的方法。 對象數可以大於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/zh-CN/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});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM