2013年5月27日月曜日

ドット記法のStringを元にオブジェクトのメンバを取得する[JavaScript]

以下のような階層の深いオブジェクトから、任意の階層にあるプロパティを楽に取得したくて作ってみました。

var foo = {
  bar: {
    hoge: 1,
    fuga: {
      isBar: true
    }
  }
};

こんな感じ。

var findRecursively = function(keyString, src) {
    var varSplitter = /\./,
        srcObj = src || window,
        keyAry = keyString.split(varSplitter),
        key;

    while (key = keyAry.shift()) {
      obj = obj[key];
      if (!obj) {
        return null;
      }
    }
    return obj;
};

var result = findRecursively('foo.bar.hoge');
console.log(result);  // 1

var result2 = findRecursively('bar.fuga.isBar', foo);
console.log(result2); // true

第一引数には、取得したいプロパティの場所をドット記法で表記したStringを渡します。
第二引数には第一引数で渡したプロパティを探したいオブジェクトを渡します。
第二引数がない場合はwindow変数から探します。

if ('foo' in window && 'bar' in foo && …) {
  ...
}

みたいな書き方をしないで済むようになります。