0

我无法弄清楚如何使用类似的函数访问多级深层对象中的变量

getLanguageVariable("form.passwordSwitch.disabled");

和以下对象作为样本

var language = {
    "de": {
        "form": {
            "passwordSwitch": {
                "enabled": "Der Klartext-Modus ist aus. Aktivieren?",
                "disabled": "Der Klartext-Modus ist an. Deaktivieren?"
            }
        }
    }
}

试图在点字符处拆分字符串,然后创建一个字符串表示

language["de"]["form"]["passwordSwitch"]["enabled"]

它用于访问对象及其属性。我使用了这段代码:

var stack = variableIdentifier.split(".");
var reference = "";

for (i = 0; i < stack.length; i++) {
    if (i == 0) reference += stack[i];
    else reference += "[\"" + stack[i] + "\"]";
}

任何线索如何动态访问对象的属性,因为您不知道它有多深?

4

2 回答 2

1

几天前我在 python 中实现了相同的功能。基本上,当您不知道对象有多深时,请使用递归模式

function getPath(obj, path)
{
    path = path.split('.');
    return _getpath(obj, path);
}

function _getPath(obj, path)
{
    if(!path.length)
        return obj;

    p = path.shift();

    if(obj[p])
        return _getPath(obj[p], path);

    return undefined;
}
于 2012-07-19T13:51:43.607 回答
0

你可以做这样的事情;

function getLanguageVariable(path) {
    // I don't know how you determine "de", but this should be
    // easy to customise
    var next = language.de;

    // Make path = ["form","passwordSwitch","disabled"];
    path = path.split(/\./);

    // Loop over path, and for each pass, set next to the next key
    // e.g. next = next["form"];
    //      next = next["passwordSwitch"]
    //      next = next["disabled"]
    while (path.length && (next = next[path.shift()]) && typeof next === "object" && next !== null);

    // Check we have used all the keys up (path.length) and return
    // either undefined, or the value
    return path.length ? undefined : next;
}

对于将来的信息,请注意您拥有的是通过 Object Literal Syntax 定义的 Object,而根本不是 JSON;有关更多信息,请参阅JSON 和 Object Literal Notation 有什么区别?

于 2012-07-19T13:49:36.550 回答