【问题标题】:How to "migrate" one object to another object in JavaScript?如何在 JavaScript 中将一个对象“迁移”到另一个对象?
【发布时间】:2022-01-03 05:56:45
【问题描述】:

给定两个对象,命名为:ObjectA 和 ObjectB:

var ObjectA = {
    config1: "5",
    config2: "6",
    config3: "7"
}
var ObjectB = {
    config1: "1",
    config2: "2",
    config4: "3",
    config5: "4"
}

如何从ObjectB 复制到ObjectA,以便ObjectA 具有与ObjectB 相同的属性,而ObjectA 中的属性值被保留,ObjectB 中的值that doesn't exist 在@ 987654331@复制到ObjectA?

预期结果:

ObjectA = {
    config1: "5",
    config2: "6",
    config4: "3",
    config5: "4"
}
  • config3 被删除,因为它在 ObjectB 中不存在,
  • config4 和 config5 被复制到 ObjectA,因为它们在 ObjectA 中不存在,
  • 和 config1 和 config2 中的值在 ObjectA 中保持相同,因为这两个对象都存在)

【问题讨论】:

  • 有很多方法可以实现这一点。您能否发布您迄今为止尝试过的代码,以便我们可以帮助您解决问题。
  • 分两步完成。首先遍历 ObjectA 中的属性。如果它在 ObjectB 中不存在,请将其删除。然后遍历 ObjectB 中的属性。如果 ObjectA 中不存在,则复制它。
  • @fast-reflexes 这不会删除属性。

标签: javascript object


【解决方案1】:

使用reduce:

ObjectA = Object.keys(ObjectB).reduce(
    (acc, key) => ({ ...acc, [key]: ObjectA[key] ?? ObjectB[key]}), {}
)

这将使用来自ObjectB 的键,从ObjectA 获取值,当它们存在时(回退到ObjectB),并用结果填充一个空对象。

【讨论】:

    【解决方案2】:

    可以使用reducer函数来解决。

    var ObjectA = {
        config1: "5",
        config2: "6",
        config3: "7"
    }
    var ObjectB = {
        config1: "1",
        config2: "2",
        config4: "3",
        config5: "4"
    }
    
    const res = Object.keys(ObjectB).reduce((prev, next) => {
      if(ObjectA[next]){
        prev[next] = ObjectA[next];
      }
      return prev;
    }, {...ObjectB})
    console.log(res)

    【讨论】:

    • 如果你要使用spread为什么不直接用它来解决问题呢?
    • 不,预计输出不会不同。
    • 我明白了,它只需要合并现有的键!
    • 该代码适用于字符串或数字,但对于布尔值,迁移的值将始终为真,除非两个值都为假。就像如果 ObjectA 是 {a: false, b: true} 和 ObjectB 是 {a: true} 那么值 a 将是 true 而不是 false
    【解决方案3】:

    这是一个更老派的可能解决方案: 这基本上是做什么的:

    • 遍历 ObjectA 中的属性。如果ObjectB中不存在,则删除
    • 循环遍历 ObjectB 中的属性。如果 ObjectA 中不存在,则复制它。
    function mergeObject(oldObj: Object, newObj: Object) {
        var copyOfOldObj = Object.assign({}, oldObj);
        for (const key in copyOfOldObj) {
            if (!newObj.hasOwnProperty(key)) {
                delete copyOfOldObj[key];
            }
        }
        for (const key in newObj) {
            if (!copyOfOldObj.hasOwnProperty(key)) {
                copyOfOldObj[key] = newObj[key];
            }
        }
        return copyOfOldObj;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-07
      • 2017-07-06
      • 2017-01-19
      • 1970-01-01
      相关资源
      最近更新 更多