【问题标题】:How to merge multiple objects into one?如何将多个对象合并为一个?
【发布时间】:2019-02-07 16:13:29
【问题描述】:

我正在寻找一种将具有相同键的多个对象合并到一个大对象的方法。对象的数量可以超过 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'
    }
  }
}

【问题讨论】:

标签: javascript object ecmascript-6 javascript-objects


【解决方案1】:

当对象的数量是动态的时试试这个:

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});

【讨论】:

  • 在我的旧答案中,我认为对象的数量是 2。请查看我更新的答案。
【解决方案2】:

用于数组合并的函数mergeArray

const mergeArray = (firstArray, secondArray) => {
  return {
    locale: 'en',
    messages: {
      en: {
          ...firstArray.en,
          ...secondArray.en
      },
      fr: {
        ...firstArray.fr,
        ...secondArray.fr
      }
    }
  }
};

console.log(mergeArray(a, b));

下面的 sn-ps 会给你预期的输出。

const value = { locale: 'en', messages: { en: { ...a.en, ...b.en }, fr: { ...a.fr, ...b.fr } }};
console.log(value)

【讨论】:

  • 我在函数中实现了相同的。
【解决方案3】:

您可以对对象的每个级别使用深度合并功能。

函数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; }

【讨论】:

    【解决方案4】:

    如果你想要一个新的对象,你可以使用 Object.Assign({}, a, b)

    阅读:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

    【讨论】:

    • 将其更新为新对象 Object.Assign({}, a, b) @Attersson
    • 第二次编辑创建了一个新对象,与将a 合并到第二个对象中的 OP 请求相反。没有没有。
    • @Attersson - aconst 的事实与您是否可以修改它所引用的对象无关。你可以。 (这并不是一个好的答案,但我想我会提到它。)
    • @TJCrowder 你是对的,我的意思是它应该不是最终合并的目标(因此不是变异的目标),在 OP 意图中,这个答案的原始版本仍然让它们交换
    猜你喜欢
    • 2018-02-09
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 2020-10-13
    • 2016-04-30
    相关资源
    最近更新 更多