在JSON中查找给定键的值,并使用javascript更改该值
我想写一个函数,它可以根据一个键查找一个值,并用另一个值替换该值。该键是来自JSON开始节点的树。这是一个例子在JSON中查找给定键的值,并使用javascript更改该值,javascript,json,Javascript,Json,我想写一个函数,它可以根据一个键查找一个值,并用另一个值替换该值。该键是来自JSON开始节点的树。这是一个例子 var myData = { name : 'Dan', address: { city : 'Santa Clara', details : { 'prevhouse' : '' } } } 该函数的输入是一个键树。例如,myData地址详细
var myData = {
name : 'Dan',
address: {
city : 'Santa Clara',
details : {
'prevhouse' : ''
}
}
}
该函数的输入是一个键树。例如,myData地址详细信息prevhouse
当我用一个新值传递这个键时,比如“Texas”,prevhouse值将更改为我发送的新值
新的JSON将
var myData = {
name : 'Dan',
address: {
city : 'Santa Clara',
details : {
'prevhouse' : 'Texas'
}
}
}
这是我到目前为止写的
var tree = key.split("-");
现在树变量包含[“myData”、“address”、“details”、“prevhouse”]
我知道我们可以使用myData[tree[0]][tree[1]][tree[2]]访问该对象,但不知何故无法从解析的值中动态获取它
由于深度的长度直到运行时才知道,我们如何动态地生成它
希望能得到帮助。鉴于对象是
myData
,我认为您应该使用myData[tree[1]][tree[2]][tree[3]
并丢弃数组中的第一项
类似的东西应该是递归的(未经测试)
考虑到对象是
myData
,我认为您应该使用myData[tree[1]][tree[2]][tree[3]]
并丢弃数组中的第一项
类似的东西应该是递归的(未经测试)
您应该能够遍历每个键,因为您的JSON只是一个JS对象。因此,检查每个键,检查它是否已定义,如果已定义,则使用该对象进行下一次检查。这会让你到达你想去的地方。请记住,您将为您的值设置最后一个键 不处理设置的基本psuedo代码:
obj = data;
for (key in keys) {
obj = obj[key]
}
您应该能够遍历每个键,因为您的JSON只是一个JS对象。因此,检查每个键,检查它是否已定义,如果已定义,则使用该对象进行下一次检查。这会让你到达你想去的地方。请记住,您将为您的值设置最后一个键 不处理设置的基本psuedo代码:
obj = data;
for (key in keys) {
obj = obj[key]
}
这样做可以:
function update(node, path, value) {
path = path.split('-');
do {
node = node[path.splice(0, 1)];
} while(path.length > 1);
node[path[0]] = value;
}
这样做可以:
function update(node, path, value) {
path = path.split('-');
do {
node = node[path.splice(0, 1)];
} while(path.length > 1);
node[path[0]] = value;
}
请尝试使用以下代码:
var myData = {
name: 'Dan',
address: {
city: 'Santa Clara',
details: {
prevhouse: ''
}
}
};
function setAttribute(obj, key, value) {
var i = 1,
attrs = key.split('-'),
max = attrs.length - 1;
for (; i < max; i++) {
attr = attrs[i];
obj = obj[attr];
}
obj[attrs[max]] = value;
console.log('myData=', myData);
}
setAttribute(myData, "myData-address-details-prevhouse", "Texas");
var myData={
名字:“丹”,
地址:{
城市:“圣克拉拉”,
详情:{
上议院:''
}
}
};
函数setAttribute(对象、键、值){
var i=1,
attrs=key.split('-'),
最大值=属性长度-1;
对于(;i
一个正在运行的JSFIDLE演示;查看控制台以了解结果尝试使用以下代码:
var myData = {
name: 'Dan',
address: {
city: 'Santa Clara',
details: {
prevhouse: ''
}
}
};
function setAttribute(obj, key, value) {
var i = 1,
attrs = key.split('-'),
max = attrs.length - 1;
for (; i < max; i++) {
attr = attrs[i];
obj = obj[attr];
}
obj[attrs[max]] = value;
console.log('myData=', myData);
}
setAttribute(myData, "myData-address-details-prevhouse", "Texas");
var myData={
名字:“丹”,
地址:{
城市:“圣克拉拉”,
详情:{
上议院:''
}
}
};
函数setAttribute(对象、键、值){
var i=1,
attrs=key.split('-'),
最大值=属性长度-1;
对于(;i
一个正在运行的JSFIDLE演示;查看控制台以了解结果查找递归,然后查看JSON如何使用递归工作。一旦你开始思考这个问题,你会发现这个问题非常简单。一旦你开始思考这个问题,你会发现它非常简单。比我的暴力方法更聪明。基于键,您需要首先移动键数组,因为它引用顶级对象,至少在示例数据中是这样。比我的暴力方法更聪明。基于键,您需要首先移动键数组,因为它引用顶级对象,至少在示例数据中是这样。