为了账号安全,请及时绑定邮箱和手机立即绑定

以递归方式循环遍历对象(树)

以递归方式循环遍历对象(树)

慕妹3146593 2019-08-08 16:29:48
以递归方式循环遍历对象(树)有没有办法(在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
查看完整描述

3 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

你正在寻找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 objectsfunction eachRecursive(obj){
    for (var k in obj)
    {
        if (typeof obj[k] == "object" && obj[k] !== null)
            eachRecursive(obj[k]);
        else
            // do something... 
    }}


查看完整回答
反对 回复 2019-08-08
?
慕桂英546537

TA贡献1848条经验 获得超10个赞

如果要返回关系树,可以递归使用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));


查看完整回答
反对 回复 2019-08-08
?
慕村225694

TA贡献1880条经验 获得超4个赞

您可以使用内置的解析函数来创建递归函数。

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 funcitonfunction 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 consoleparseObjectProperties(foo, function(prop) {
  console.log(prop)})


查看完整回答
反对 回复 2019-08-08
  • 3 回答
  • 0 关注
  • 1949 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信