使用更改的值访问Javascript对象
如果我有一个JSON,例如:使用更改的值访问Javascript对象,javascript,json,Javascript,Json,如果我有一个JSON,例如: { "test1":{ "test11":"someting", "test12":"something else" }, "test2":{ "test21":"asdasd", "test22":"qwasd" } } 我想访问和修改一些数据,但不知道是哪一个。 我将有一个这样的密钥数组: [“test2”、“test22”]和一个值:“更改为此” 我想将myjson.test2.t
{
"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'来自用户这也是一个很好的答案。我接受了另一个,因为在我看来这更“优雅”。谢谢你。