web-dev-qa-db-ja.com

Javascript:パスを文字列として渡すことにより、オブジェクトから深い値を取得します

可能性のある複製:
文字列キーによるネストされたJavaScriptオブジェクトへのアクセス

タイトルが十分に明確ではないかもしれません。探しているものを指定する方法がわからなかっただけで、英語が本当に下手です、すみません。

私はオブジェクト値を返す関数を作成しようとしていますが、ネストされたオブジェクトでニースも再生します。例えば:

var obj = {
  foo: { bar: 'baz' }
};

文字列「foo.bar」を関数に追加して、obj.foo.barの値にアクセスしたい。

function(obj, path) {
  // Path can be "foo.bar", or just "foo".
}

ありがとう!

56
7elephant

このことを考慮:

var obj = {
  foo: { bar: 'baz' }
};

function deepFind(obj, path) {
  var paths = path.split('.')
    , current = obj
    , i;

  for (i = 0; i < paths.length; ++i) {
    if (current[paths[i]] == undefined) {
      return undefined;
    } else {
      current = current[paths[i]];
    }
  }
  return current;
}

console.log(deepFind(obj, 'foo.bar'))
40
qiao

これは正しく動作します:

var deep_value = function(obj, path){
    for (var i=0, path=path.split('.'), len=path.length; i<len; i++){
        obj = obj[path[i]];
    };
    return obj;
};

以下が証拠/デモです: jsfiddle.net/tadeck/5Pt2q/13/

編集:冗長な変数を削除し、コードを短縮しました。

74
Tadeck

あなたはこのようなものを意味しますか?再帰バージョンです

function recLookup(obj, path) {
    parts = path.split(".");
    if (parts.length==1){
        return obj[parts[0]];
    }
    return recLookup(obj[parts[0]], parts.slice(1).join("."));
}

http://jsfiddle.net/kExSr/ を参照してください

8
fyr

何かのようなもの:

function(obj, path) {
  var current=obj; 
  path.split('.').forEach(function(p){ current = current[p]; }); 
  return current;
}
6
Dan D.

文字列をドットで分割してから、オブジェクトに繰り返しインデックスを作成する必要があります。以下の線に沿って:

function goDeep(obj, path) {
    var parts = path.split('.'),
        rv,
        index;
    for (rv = obj, index = 0; rv && index < parts.length; ++index) {
        rv = rv[parts[index]];
    }
    return rv;
}

実例

いくつかの異なる方法でオブジェクトのプロパティにアクセスできるため、これは機能します。リテラル(obj.foo)、文字列(obj["foo"])。後者の場合、文字列は任意の式の結果であり、文字列リテラルである必要はありません。すべてで、rvは同じ値に設定されます。

rv = obj.foo.bar;
// Or
rv = obj.foo["bar"];
// Or
f = "foo";
rv = obj[f].bar;
// Or
s = "b";
rv = obj.foo[s + "ar"];
4
T.J. Crowder