鍍金池/ 問(wèn)答/HTML/ javascript深度遍歷二叉樹(shù)問(wèn)題

javascript深度遍歷二叉樹(shù)問(wèn)題

我就直接上代碼吧!直接在瀏覽器跑下就知道了! 各位大神 就是報(bào)了個(gè)錯(cuò)

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)
回答
編輯回答
蔚藍(lán)色

題主把其他的 console 注釋掉,在 while 里面加一個(gè) 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);//新增:最后一個(gè) 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
          }
        }

報(bào)錯(cuò)的原因是,你在 for 循環(huán)里遞歸的時(shí)候,報(bào)錯(cuò)之前已經(jīng)把 objStack 清空了,所以在 for 循環(huán)里 objStack[objStack.length - 1].children 這樣用的時(shí)候,相當(dāng)于objStack[-1].children ,objStack 是個(gè)空數(shù)組,當(dāng)然報(bào)錯(cuò)了,,
解決辦法:我給你沒(méi)有辦法參與循環(huán)的時(shí)候,直接跳出了 while 循環(huán),不知道是不是你想要的結(jié)果:

        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);//最后一個(gè) 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
          }
        }

代碼不加分號(hào),可讀性差

2017年2月11日 10:20
編輯回答
不歸路
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));
2017年11月26日 16:13