javascript - 根据可作为数组使用的动态键更新 json 对象中的值

标签 javascript json

我有一个像这样的 json 对象:

var obj = {
    "glossary": {
        "title": "example glossary",
        "GlossDiv": {
            "title": "S",
            "GlossList": {
                "GlossEntry": {
                    "ID": "SGML",
                    "SortAs": "SGML",
                    "GlossTerm": "Standard Generalized Markup Language",
                    "Acronym": "SGML",
                    "Abbrev": "ISO 8879:1986",
                    "GlossDef": {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
                        "GlossSeeAlso": ["GML", "XML"]
                    },
                    "GlossSee": "markup"
                }
            }
        }
    }
}

此 JSON 可以是任何有效的 JSON。现在我想基于可用的数组访问和更新一些属性,如下所示:

['glossary', 'GlossDiv', 'GlossList', 'GlossEntry', 'SortAs'] // any dynamic but valid path

所以给定上面的数组,我想访问

obj['glossary']['GlossDiv']['GlossList']['GlossEntry']['SortAs']

这样我就可以更新它的值。我有 config(或任何此类 json)作为实例变量,所以我想直接更新它,而不是创建一个新的 json,然后替换整个 config 对象。我可以访问 jQuery、underscore、backbone,当然还有普通的旧 JS。

最佳答案

您可以通过沿着路径行走来减少物体。

function getValue(object, path) {
    return path.reduce(function (o, k) {
        return (o || {})[k];
    }, object);
}

var object = { glossary: { title: "example glossary", GlossDiv: { title: "S", GlossList: { GlossEntry: { ID: "SGML", SortAs: "SGML", GlossTerm: "Standard Generalized Markup Language", Acronym: "SGML", Abbrev: "ISO 8879:1986", GlossDef: { para: "A meta-markup language, used to create markup languages such as DocBook.", GlossSeeAlso: ["GML", "XML"] }, GlossSee: "markup" } } } } };

console.log(getValue(object, ['glossary', 'GlossDiv', 'GlossList', 'GlossEntry', 'SortAs']));

关于javascript - 根据可作为数组使用的动态键更新 json 对象中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40405940/

相关文章:

json - 反序列化 "oneOf"结构的 Json 数组

javascript - 我应该使用表单将 JSON 数据提交给 REST api

javascript - 如何在不重建 angular cli 的情况下更新 .json 文件?

javascript - 动态地,在具有指定类名 (jQuery) 的每个元素(div、图像、跨度等)上添加重叠的 div

javascript - 将球从一个点弹到另一个点 - 矢量和加速度

javascript - Google 登录 - 未定义 googleUser

json - 在 ServiceStack 中查看 Http Response 内容

json - Jackson mixin 注释以包含某些属性并排除其他所有内容

javascript - 我正在使用 Angular 2,我已经创建了一个表单并根据需要标记了字段,但我仍然已提交

javascript - 如何将窗口对象从事件选项卡发送到扩展?