javascript深度遍历二叉树问题

我就直接上代码吧!直接在浏览器跑下就知道了! 各位大神 就是报了个错

function objectIterator (object, arr, objStack) {
        let count = 0
        if (!arr.length) {
          return
        }
        if (arr.indexOf(object.id) > -1) {
          object.disabled = true
        }
        if (object.children.length) {
          objStack.push(object)
        } else {
          return
        }
        console.warn(objStack.length, objStack[0])
        while (objStack.length) {
          for (let i = count; i < objStack[objStack.length - 1].children.length; i++) {
            this.objectIterator(objStack[objStack.length - 1].children[i], arr, objStack)
          }
          let obj = objStack.pop()
          if (obj.parent && obj.parent.children && Array.isArray(obj.parent.children)) {
            count = obj.parent.children.indexOf(obj) + 1
          } else {
            count = 0
          }
        }
      }

let obj = {
  id: '1',
  name: '1name',
  disabled: false,
  parent: null,
  children: [{
    id: '2',
    name: '2name',
    disabled: false,
    children: [{
    id: '5',
    name: '5name',
    disabled: false,
    children: []
  }]
  }, {
    id: '3',
    name: '3name',
    disabled: false,
    children: []
  }, {
    id: '4',
    name: '4name',
    disabled: false,
    children: []
  }]
}
obj.children.forEach(item => {
  item.parent = obj
})
obj.children[0].children.forEach(item => {
  item.parent = obj.children[0]
})

objectIterator(obj, ['1', '2', '5'], [])

console.warn(obj)
阅读 1.9k
2 个回答

题主把其他的 console 注释掉,在 while 里面加一个 console

while (objStack.length) {
          for (let i = count; i < objStack[objStack.length - 1].children.length; i++) {
            /*this.*/objectIterator(objStack[objStack.length - 1].children[i], arr, objStack)
          console.log(objStack[objStack.length - 1],objStack.length);//新增:最后一个 undefined,0
          }
          let obj = objStack.pop()
          if (obj.parent && obj.parent.children && Array.isArray(obj.parent.children)) {
            count = obj.parent.children.indexOf(obj) + 1
          } else {
            count = 0
          }
        }

报错的原因是,你在 for 循环里递归的时候,报错之前已经把 objStack 清空了,所以在 for 循环里 objStack[objStack.length - 1].children 这样用的时候,相当于objStack[-1].children ,objStack 是个空数组,当然报错了,,
解决办法:我给你没有办法参与循环的时候,直接跳出了 while 循环,不知道是不是你想要的结果:

        loop://新增
        while (objStack.length) {
          for (let i = count; i < objStack[objStack.length - 1].children.length; i++) {
            this.objectIterator(objStack[objStack.length - 1].children[i], arr, objStack)
          //console.log(objStack[objStack.length - 1],objStack.length);//最后一个 undefined,0
            if(objStack.length===0){break loop;}//新增
          }
          let obj = objStack.pop()
          if (obj.parent && obj.parent.children && Array.isArray(obj.parent.children)) {
            count = obj.parent.children.indexOf(obj) + 1
          } else {
            count = 0
          }
        }

代码不加分号,可读性差

let obj = {
    id: '1',
    name: '1name',
    disabled: false,
    parent: null,
    children: [{
        id: '2',
        name: '2name',
        disabled: false,
        children: [{
            id: '5',
            name: '5name',
            disabled: false,
            children: []
        }]
    }, {
        id: '3',
        name: '3name',
        disabled: false,
        children: []
    }, {
        id: '4',
        name: '4name',
        disabled: false,
        children: []
    }]
};

function deepIterator(item,nodeList){
    var node;
    if(item.children&&Array.isArray(item.children)&&item.children.length!==0){
        item.children.forEach(function(item){
            deepIterator(item,nodeList);
        });
    }
    node={
        id:item.id,
        name:item.name,
        disabled:item.disabled
    };
    nodeList.push(node);
}

var nodeList=[];
deepIterator(obj,nodeList);
console.log(JSON.stringify(nodeList));
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题