我有一些 json :数据
。
我有一个如下所示的字符串构建:
sections.1.subsections.0.items.0.itation.paragraph
我需要做的是操纵该字符串以便能够访问data
中的该值。所以把它变成可用的东西:
数据['章节'][1]['小节'][0]['项目'][0]['引文']['段落']
然后用它来更改数据中的值。所以:
data['sections'][1]['subsections'][0]['items'][0]['itation']['paragraph'] = '新值'
我可以拆分 .
上的原始字符串,我认为可以让我到达某个地方,但我完全不确定如何重新使用这些部分允许我访问 data
中的该值。
谢谢!
最佳答案
我仍然不太清楚为什么要以这种方式处理 JSON,但如果必须这样做,那么您将需要使用递归来访问数据。假设我正确映射了您的对象,下面的示例应该为您提供执行此操作的方法:
var data = {
sections: [
{
subsections: []
},
{
subsections: [
{
items: [
{
citation: {
paragraph: "Citation by Warlock"
}
}
]
}
]
}
]
};
var string = "sections.1.subsections.0.items.0.citation.paragraph",
parts = string.split('.');
function getValue(tree, index) {
if(index < (parts.length - 1)) {
return getValue(tree[parts[index]], index + 1);
} else {
return tree[parts[index]];
}
}
function setValue(tree, index, newValue) {
if(index < (parts.length - 1)) {
setValue(tree[parts[index]], index + 1, newValue);
} else {
tree[parts[index]] = newValue;
}
}
alert(getValue(data, 0));
setValue(data, 0, "New Citation By Warlock");
alert(getValue(data, 0));
其想法是,getValue(...);
函数深入 JSON 一层,然后递归调用自身。这允许一次一步地访问数据,直到检索到最后一部分。然后通过之前所有函数调用中的递归返回该值。
同样的想法也适用于设置值。 setValue(...);
函数一次进入 JSON 一层,传递要设置的新值,直到到达最后一个嵌套层。然后为指定的属性设置该值。
编辑:
更好的实现是将 parts
数组传递到 getValue(...);
和 setValue(...);
消除外部依赖的功能。然后,在函数内移动数组的数据值以逐步遍历嵌套层。这消除了基于原始数组值的索引跟踪的需要:
var data = {
sections: [
{
subsections: []
},
{
subsections: [
{
items: [
{
citation: {
paragraph: "Citation by Warlock"
}
}
]
}
]
}
]
};
var string = "sections.1.subsections.0.items.0.citation.paragraph",
parts = string.split('.');
function getValue(temp, tree) {
if(temp.length > 1) {
tree = tree[temp[0]];
temp.shift();
return getValue(temp, tree);
} else {
return tree[temp[0]];
}
}
function setValue(temp, tree, newValue) {
if(temp.length > 1) {
tree = tree[temp[0]];
temp.shift();
setValue(temp, tree, newValue);
} else {
tree[temp[0]] = newValue;
}
}
alert(getValue(parts, data));
setValue(parts, data, "New Citation By Warlock");
alert(getValue(parts, data));
关于javascript - 使用字符串访问 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29705687/