从链接对象动态检索变量

时间:2012-07-19 13:45:33

标签: javascript

我在使用像

这样的函数找出如何访问多级深层对象中的变量时遇到了麻烦
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] + "\"]";
}

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

2 个答案:

答案 0 :(得分:1)

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

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;
}

答案 1 :(得分: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;
}

为了将来的信息,请注意您拥有的是通过对象文字语法定义的对象,而不是JSON;有关详细信息,请参阅What is the difference between JSON and Object Literal Notation?