javascript - 使用字符串访问 json

标签 javascript json string object

我有一些 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/

相关文章:

javascript - 将下拉动画应用于移动导航

javascript - 如何关闭 JavaScript 中的 CSS 像素比,以便我可以在手机上创建高清游戏?

jquery - Flickr API 错误,Json 回调

javascript - JSON-Object 作为字符串 : Use of concat(), eval() 和/或 JSON.parse()?

javascript - 提高js动画的性能

JavaScript split 为空字符串赋予数组大小 1,而不是 0

java - @JsonSerialize(using = MyCustomSerializer.class 没有按预期工作

string - Swift 2.0 在字符串和枚举之间切换 :String

string - Lisp:将数字转换为字符串

Python 正则表达式 : Proper way to extract separated numbers (AxBxC -> [A, B, C])