web-dev-qa-db-ja.com

オブジェクト(ツリー)を再帰的にループする

(jQueryまたはJavaScriptで)各オブジェクトをループする方法はありますか?それは子供や孫などです?

もしそうなら...私も彼らの名前を読むことができますか?

例:

foo :{
  bar:'',
  child:{
    grand:{
      greatgrand: {
        //and so on
      }
    }
  }
}

ループは次のようになります...

loop start
   if(nameof == 'child'){
     //do something
   }
   if(nameof == 'bar'){
     //do something
   }
   if(nameof =='grand'){
     //do something
   }
loop end
51
Val

あなたが探している for...in ループ:

for (var key in foo)
{
    if (key == "child")
        // do something...
} 

を注意 for...inループは、オブジェクトのプロトタイプに追加されたプロパティを含む、列挙可能なプロパティを繰り返し処理します。これらのプロパティを操作しないようにするには、hasOwnPropertyメソッドを使用して、プロパティがそのオブジェクトのみに属しているかどうかを確認できます。

for (var key in foo)
{
    if (!foo.hasOwnProperty(key))
        continue;       // skip this property
    if (key == "child")
        // do something...
}

ループを再帰的に実行するには、再帰関数を書くのと同じくらい簡単です。

// This function handles arrays and objects
function eachRecursive(obj)
{
    for (var k in obj)
    {
        if (typeof obj[k] == "object" && obj[k] !== null)
            eachRecursive(obj[k]);
        else
            // do something... 
    }
}
86
Andy E

関係のツリーを取得したい場合は、Object.keysを再帰的に使用できます。

function paths(item) {
  function iter(r, p) {
    var keys = Object.keys(r);
    if (keys.length) {
      return keys.forEach(x => iter(r[x], p.concat(x)));
    }
    result.Push([p])
  }
  var result = [];
  iter(item, []);
  return result;
}

var data = {
  foo: {
    bar: '',
    child: {
      grand: {
        greatgrand: {}
      }
    }
  }
}

console.log(paths(data));
2
Rick

解析関数が組み込まれた再帰関数を使用できます。

function parseObjectProperties (obj, parse) {
  for (var k in obj) {
    if (typeof obj[k] === 'object' && obj[k] !== null) {
      parseObjectProperties(obj[k], parse)
    } else if (obj.hasOwnProperty(k)) {
      parse(obj[k])
    }
  }
}

OPのfooオブジェクトを使用します。ここではどのように動作するのか

var foo = {
  bar:'a',
  child:{
    b: 'b',
    grand:{
      greatgrand: {
        c:'c'
      }
    }
  }
}

// use this recursive function with a parse funciton
function parseObjectProperties (obj, parse) {
  for (var k in obj) {
    if (typeof obj[k] === 'object' && obj[k] !== null) {
      parseObjectProperties(obj[k], parse)
    } else if (obj.hasOwnProperty(k)) {
      parse(obj[k])
    }
  }
}
//***

// then apply to the property the task you want, in this case just console
parseObjectProperties(foo, function(prop) {
  console.log(prop)
})