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 とオブジェクト リテラル表記の違いは何ですか?」を参照してください。

于 2012-07-19T13:49:36.550 に答える