0

ちょっとした問題で悩んでいます。私がオブジェクトを持っているとしましょう:

var foo = {
    bar: {
        baz: true
    }
};

今、私は String も持ってい'foo.bar.baz'ます。文字列を使用してオブジェクトから値を取得したいと思います。

注意: これは単なる例であり、ソリューションは動的である必要があります。

アップデート:

変数名も動的にして文字列から解析する必要があります。また、変数がウィンドウのプロパティであるかどうかもわかりません。

私はすでに を使用してソリューションを構築しましたevalが、これはかなり醜いと思います: http://jsfiddle.net/vvzyX/

4

4 に答える 4

4

例えば、

function get(obj, path) {
    return path.split('.').reduce(function(obj, p) {
        return obj[p]
    }, obj);
}

デモ:

tree = {
    foo: {
        bar: 1,
        baz: { quux: 3 },
    },
    spam: 1
}

console.log(get(tree, 'foo.baz.quux')) // 3
于 2013-01-17T09:27:25.570 に答える
2

これを行う方法は次のとおりです。

function getValue(namespace, parent) {
    var parts = namespace.split('.'),
        current = parent || window;
    for (var i = 0; i < parts.length; i += 1) {
        if (current[parts[i]]) {
            current = current[parts[i]];
        } else {
          if (i >= parts.length - 1)
            return undefined;
        }
    }
    return current;
}
var foo = {
    bar: {
        baz: true
    }
};
console.log(getValue('foo.bar.baz')); //true

関数の最初の引数は名前空間 (ドットで区切られた値) で、2 番目の引数はparentオブジェクトです。parent が指定されていない場合は、それwindowが使用されます。

親引数を使用したもう 1 つの例:

var str = 'foo.bar.baz';
    foo = {
       bar: {
          baz: true
       }
    };

result = getValue(str, foo);
console.log(result);

これはjsfiddleの例です。

同様のアプローチが YUI でも使用されています。彼らのアプローチは名前空間パターンと呼ばれます。主な利点は、パッケージ/名前空間のシミュレーションです。このスクリプトと名前空間パターンの唯一の違いは、名前空間関数が値を返すだけでなく、ネストされた構造を作成することです。

于 2013-01-17T09:27:11.867 に答える
2

これを試して:

var name = [window].concat('foo.bar.baz'.split('.')).reduce(function(prev, curr) {
    return prev[curr];
});

console.log(name);

// -> 'true'
于 2013-01-17T09:27:30.017 に答える
0

私が考えることができるのは、最初に文字列分割を使用してその文字列を配列に分割し[]、ループでそのオブジェクトの属性にアクセスするためにオブジェクトにアクセスすることです

于 2013-01-17T09:26:58.673 に答える