我有一些json:data
。
我有一个字符串构建,如下所示:
sections.1.subsections.0.items.0.citation.paragraph
我需要做的是操纵该字符串以便能够在data
中访问该值。所以把它变成可用的东西:
data['sections'][1]['subsections'][0]['items'][0]['citation']['paragraph']
然后用它来改变数据中的那个值。所以:
data['sections'][1]['subsections'][0]['items'][0]['citation']['paragraph'] = 'new value'
我可以将.
上的原始字符串拆开,然后认为让我找到某个地方,但我完全不确定如何重新使用这些部分以允许我可以在data
中访问该值。
谢谢!
答案 0 :(得分:3)
我仍然不太确定你为什么要以这种方式处理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一层,将新值传递给set,直到它到达最后一个嵌套层。然后为指定的属性设置值。
修改强>
更好的实现是将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));