IT이야기

객체(트리)를 재귀적으로 반복

cyworld 2021. 5. 1. 09:33
반응형

객체 (트리)를 재귀 적으로 반복


(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

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... 
    }
}

관계 트리를 되돌리려면 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));


구문 분석 함수가 내장 된 재귀 함수를 가질 수 있습니다.

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])
    }
  }
}

나는 fooOP 객체를 사용 합니다.

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)
})

참조 URL : https://stackoverflow.com/questions/2549320/looping-through-an-object-tree-recursively

반응형