【问题标题】:How to update json key passed as a variable with json data in array format in javascript? [duplicate]如何在javascript中使用数组格式的json数据更新作为变量传递的json键? [复制]
【发布时间】:2020-10-19 06:55:20
【问题描述】:

下面是我的json内容

{
    "demoPO":{
      "login":["demoJPLog in", "demoFRLog in","GELog in"],
      "cancel":["demoJPCancel", "demoFRcancelo","GEcancelo"],
      "content":["demoJPcontent", "demoFRcontent","GEcontent"]
    },
    "demoPO2":{
      "login":["JPLog in", "FRLog in","GELog in"],
      "cancel":["JPCancel", "FRcancelo","GEcancelo"],
      "content":["JPcontent", "FRcontent","GEcontent"],
      "submit":["JPsubmit", "FRsubmit","GEsubmit"]
    }
}

我想更新密钥 demPO2.login[0]

的值
data.demoPO2.login[0] = value; //this updates key - works

consider user is passing **key** as a variable

var keyName = 'demPO2.login[0]'
data[keyname] = value; //doesn't update, adds a new one

有没有办法克服这个问题,当 json 中有多层数组时,用户可以将键作为变量传递并更新?

【问题讨论】:

  • 这里的关键是什么?您正在更新数组而不是对象。如果您通过 demPO2 很好,但将 demPO2.login[0] 作为密钥传递不是一个可行的解决方案

标签: javascript json


【解决方案1】:

你应该从key中提取到元素的路径为["demPO2", "login", "0"],然后循环它:

var json = {
    "demoPO":{
      "login":["demoJPLog in", "demoFRLog in","GELog in"],
      "cancel":["demoJPCancel", "demoFRcancelo","GEcancelo"],
      "content":["demoJPcontent", "demoFRcontent","GEcontent"]
    },
    "demoPO2":{
      "login":["JPLog in", "FRLog in","GELog in"],
      "cancel":["JPCancel", "FRcancelo","GEcancelo"],
      "content":["JPcontent", "FRcontent","GEcontent"],
      "submit":["JPsubmit", "FRsubmit","GEsubmit"]
    }
};

function extract(key) {
  var keys = key.split('.');

  var current = json;

  for (var i = 0; i < keys.length; i++) {
     if (typeof current[keys[i]] === 'undefined') {
        return null;
     }

     current = current[keys[i]];
  }
  
  return current;
}

// For simplicity we assume key is `.` separated

console.log(extract('demoPO2.login.0'));
console.log(extract('demoPO2.content.2'));
console.log(extract('demoPO2.key.notExists'));

【讨论】:

  • 谢谢,但这里是提取密钥,但我的要求是更新密钥的值
【解决方案2】:

你可以使用lodash_.set方法。

从“lodash”导入_;

_.set(data, "demoPO2.login[0]", "test1");

【讨论】:

    猜你喜欢
    • 2020-04-14
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 2021-12-11
    • 2017-10-14
    • 2018-01-30
    相关资源
    最近更新 更多