简单实现如下
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