使用更改的值访问Javascript对象

使用更改的值访问Javascript对象,javascript,json,Javascript,Json,如果我有一个JSON,例如: { "test1":{ "test11":"someting", "test12":"something else" }, "test2":{ "test21":"asdasd", "test22":"qwasd" } } 我想访问和修改一些数据,但不知道是哪一个。 我将有一个这样的密钥数组: [“test2”、“test22”]和一个值:“更改为此” 我想将myjson.test2.t

如果我有一个JSON,例如:

   {
   "test1":{
      "test11":"someting",
      "test12":"something else"
   },
   "test2":{
      "test21":"asdasd",
      "test22":"qwasd"
   }
}
我想访问和修改一些数据,但不知道是哪一个。 我将有一个这样的密钥数组:

[“test2”、“test22”]
和一个值:
“更改为此”

我想将
myjson.test2.test22
数据更改为
“更改为此”

有什么简单而优雅的方法可以做到这一点吗


请注意,我不知道数组的内容是什么,所以我不能使用
myjson.test2.test22
访问方法。

下面是一个递归函数,它遍历对象的键,直到找到匹配的键(数组中的最后一个键),然后更改它的值并返回更改的对象。基本情况是当密钥数组为空时。如果找不到密钥,则返回false

给定一个名为obj的对象

var obj =    {
   "test1":{
      "test11":"someting",
      "test12":"something else"
       },
       "test2":{
          "test21":"asdasd",
          "test22":"qwasd"
       }



 function changeAkey(object, arrayOfKeys, value){
   if(arrayOfKeys.length == 0)
      return value;
   else{
      if(!object[arrayOfKeys[0]])
         return false;
      else
         object[arrayOfKeys[0]] = changeAkey(object[arrayOfKeys[0]], arrayOfKeys.slice(1), value);
         return object;
   }
}
所以
changeAkey(obj,[“test2”,“test22”],value)
可以完成这项工作

试试这个

函数setDeep(对象、道具、值){
var cur=obj,
道具
while((prop=props.shift())和&props.length){
cur=cur[prop]
}
cur[prop]=值
返回obj;
}
var obj={
“测试1”:{
“test11”:“someting”,
“test12”:“其他东西”
},
“测试2”:{
“test21”:“asdasd”,
“test22”:“qwasd”
}
}
setDeep(obj,['test1','test12'],'newvalue');
console.log(obj)
您可以使用并沿着路径行走。然后使用最后一个关键点将值指定给对象

var object={“test1”:{“test11”:“someting”,“test12”:“something”},“test2”:{“test21”:“asdasd”,“test22”:“qwasd”},
路径=[“test2”,“test22”],
lastKey=path.pop();
reduce(函数(o,k){
返回o[k];
},object)[lastKey]=“更改为此”;

console.log(对象)我将首先检查属性是否存在以及它是否更改了数据。这样它就不会抛出非特定错误

var keys = ["key1", "key2"];
var myObj = {
  "random1": {
    "random2": "someting",
    "random3": "something else"
  },
  "key1": {
    "random4": "asdasd",
    "key2": "qwasd"
  };
}

var hasKeys = myObj[keys[0]][keys[1]] || null;
if(hasKeys) {
  myObj[keys[0]][keys[1]] = "some data";
} else {
  console.log('property not found');
}

我建议序列化对象并使用字符串
replace()
。它适用于任何深度和简单的代码

var objStr = JSON.stringify(obj);

changes.forEach(function(item){
   objStr = objStr.replace(item, to);   
})

obj = JSON.parse(objStr);
var obj={
“测试1”:{
“test11”:“someting”,
“test12”:“其他东西”
},
“测试2”:{
“test21”:“asdasd”,
“test22”:“qwasd”
}
}
变量变化=[“test11”、“test21”];
var to='更改为此';
var objStr=JSON.stringify(obj);
更改。forEach(功能(项目){
objStr=objStr.更换(项目,至);
})
obj=JSON.parse(objStr);
console.log(obj)
var obj={
“测试1”:{
“test11”:“someting”,
“test12”:“其他东西”
},
“测试2”:{
“test21”:“asdasd”,
“test22”:“qwasd”
}
};
变量键=[“test2”,“test22”];
功能更新_obj(obj、键、值){
对于(变量i=0;i控制台日志(obj)问题的可能重复是,此数组来自用户输入。所以我不能硬编码“如果”语句。我必须遍历数组并通过元素访问obj。我已经这样做了。数组:['test1','test12']和值:'newvalue'来自用户这也是一个很好的答案。我接受了另一个,因为在我看来这更“优雅”。谢谢你。