小技巧解决1w个对象递归爆栈

209 阅读1分钟

简单实现如下

window.isEnd = false; //这里为了方便写了个window对象
let obj = {
      id: 1,
      children: []
    };

//使用Object.defineProperty监听 isEnd 这个变量
Object.defineProperty(window, 'isEnd', {
  configurable: true,
  set(newVal) {
    //do anything
    console.log(newVal) //true
  },
  get() {}
});

!(function deep(root, obj) {
  if ( root.children.length ) {
    root.children.forEach((i,n)=>{
      //核心,浏览器不会分配太多的内存,所以尽可能少的过多使用栈
      //这里使用宏任务压入执行列表,分批处理
      setTimeout(()=>{
        obj[n] = {
          id: i.id,
          children: []
        }
        deep(i, obj[n].children)
      },0);
    })
  }else{
    //使用Object.defineProperty监听这个变量,如果这个变成true,说明递归跑完了
    isEnd = true
  }
})(root, obj); //root是由1w个每一层都具有children属性的对象组成的对象树

单列

采用以上方式即可

多列

多列需要考虑节点的深度不一致,引入一个变量计数标记即可




不管你是初级还是高级,只要你喜欢讨论技术,我都欢迎加QQ群讨论~
QQ群:615766495
Q群链接:前端FeNext