【问题标题】:Update json array from another json array with javascript使用javascript从另一个json数组更新json数组
【发布时间】:2022-11-26 17:12:47
【问题描述】:

编辑:更新 json 配置以包含与“appArr”处于同一级别的附加键、val 对

我想用来自不同 json 数组的子集更新来自一个 json 数组的匹配键。

我有一个像这样的全局 json 配置:

var config_global = {
  "sub-heading": "This is the sub-heading",
  "content": {
    "par1": "asdf",
    "par2": "qwerty",
    "par3": "12345"
  },
  "appArr": {
    "app1": {
      "id": "ID_001",
      "name": "Application 1",
      "url": "https://app1.html",
      "is_visible": true,
      "in_list": true
    },
    "app2": {
      "id": "ID_002",
      "name": "Application 2",
      "url": "https://app2.html",
      "is_visible": true,
      "in_list": true
    },
    "app3": {
      "id": "ID_003",
      "name": "Application 3",
      "url": "https://app3.html",
      "is_visible": true,
      "in_list": true
    }
  }
}

我想要另一个 json 数组,它将保留所有子键并只更新我的第二个 json 数组中的项目:

var config_local = {
  "content": {
    "par1": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Iure aperiam inventore nemo, asperiores dolorem nisi voluptate omnis quam sit doloremque expedita architecto dicta, at consequatur."
  },
  "appArr": {
    "app1": {
      "is_visible": false,
      "in_list": true
    },
    "app2": {
      "is_visible": false,
      "in_list": false
    },
    "app3": {
      "is_visible": true,
      "in_list": false
    }
  }
}

最终配置必须包含完整的 config_global 以及来自 config_local 的更新。

我尝试使用Oject.assign(),但这会替换应用程序配置而不是更新它。

最终配置应如下所示:

var config = {
  "sub-heading": "This is the sub-heading",
  "content": {
    "par1": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Iure aperiam inventore nemo, asperiores dolorem nisi voluptate omnis quam sit doloremque expedita architecto dicta, at consequatur."
    "par2": "qwerty",
    "par3": "12345"
  },
  "appArr": {
    "app1": {
      "id": "ID_001",
      "name": "Application 1",
      "url": "https://app1.html",
      "is_visible": false,
      "in_list": true
    },
    "app2": {
      "id": "ID_002",
      "name": "Application 2",
      "url": "https://app2.html",
      "is_visible": false,
      "in_list": false
    },
    "app3": {
      "id": "ID_003",
      "name": "Application 3",
      "url": "https://app3.html",
      "is_visible": true,
      "in_list": false
    }
  }
}

【问题讨论】:

    标签: javascript arrays json merge


    【解决方案1】:

    这是我会怎么做。

    JS 对象不能像您在问题中那样具有相同的键名。我假设这是一个打字错误,所以我按应有的方式修复了它。

    var config_global = {
      "appArr": {
        "app1": {
          "id": "ID_001",
          "name": "Application 1",
          "url": "https://app1.html",
          "is_visible": true,
          "in_list": true,
        },
        "app2": {
          "id": "ID_002",
          "name": "Application 2",
          "url": "https://app2.html",
          "is_visible": true,
          "in_list": true,
        },
        "app3": {
          "id": "ID_003",
          "name": "Application 3",
          "url": "https://app3.html",
          "is_visible": true,
          "in_list": true,
        }
      }
    }
    
    var config_local = {
      "appArr": {
        "app1": {
          "is_visible": false,
          "in_list": true,
        },
        "app2": {
          "is_visible": false,
          "in_list": false,
        },
        "app3": {
          "is_visible": true,
          "in_list": false,
        }
      }
    }
    
    var result = Object.keys(config_global['appArr']).reduce((mem, key) => {
      mem[key] = { ...config_global['appArr'][key],
        ...config_local['appArr'][key]
      }
      
      return mem;
    }, {})
    
    console.log(result)

    【讨论】:

    • 非常感谢@arup。这如我所愿。如果我有另一个密钥,与 appArr 密钥处于同一级别的 val 对(例如“title”:“My Application One”),我是否需要更改代码中的任何内容?
    猜你喜欢
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多