问题:提取页面dom节点
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta http-equiv="X-UA-Compatible" content="ie=edge" /><title>Document</title></head><body><div class="parent"><div class="children-1"><div class="children-1-1"><div class="children-1-2"><div class="children-1-3"></div></div></div></div><div class="children-2"><div class="children-2-1"><div class="children-2-2"><div class="children-2-3"></div></div></div></div><div class="children-3"><div class="children-3-1"><div class="children-3-2"><div class="children-3 3"></div></div></div></div></div></body></html>
1.深度遍历(DFS)
- 核心思想-递归
function deepTravel(node,nodeList=[]){if(node.children === null) return;nodeList.push(node)let children = node.childrenfor(let i = 0 ;i < children.length; i++){deepTravel(children[i],nodeList)}return nodeList;}
2.广度遍历(BFS)
function boardTravel(node){let nodeList = []; //resultlet stack = [];stack.push(node)while(stack.length){item = stack.shift();nodeList.push(item);for(let i = 0 ;i<item.children.length; i++){if(item.children[i]) stack.push(item.children[i])}}return nodeList;}
3.数组平铺flat
递归的应用
function getDataType(data){return Object.prototype.toString.call(data).slice(8,-1)}function flat(arr,res=[]){for(let i = 0 ;i<arr.length; i++){if(getDataType(arr[i]) === 'Array'){flat(arr[i],res)}else{res.push(arr[i])}}return res;}arr = [[1, 2, [3, [4, 5]]], [6, 7], [[8], [9, [10]]]];flat(arr)
4.单个对象深度遍历
递归和while循环之间转换
obj = {value: 1,children: {value: 1,children: {value: 2,children: {value: 3,children: null}}}};// 递归function getValue(obj,res=[]){res.push(obj.value)if(obj.children){getValue(obj.children)}return res;}//whilefunction getValue1(obj,res=[]){while(obj){res.push(obj.value)obj = obj.children;}}
5.深度克隆(深度优先)
function deepCopy(sourceObj,target={}){let keys = Object.keys(sourceObj)keys.forEach(key=>{if(typeof sourceObj[key] !== 'object'){target[key] = sourceObj[key]}else{deepCopy(sourceObj[key],target[key]={})}})return target;}
6.深度克隆(广度优先)
//广度优先复制function widthDeepCopy(source, target = {}) {let keys = Object.keys(source);let stack = [];stack = [...keys];while (stack.length) {curKey = stack.shift();if (source[curKey] !== "object") {target[curKey] = source[curKey];} else {target = target[curKey] = {};stack.push(...Object.keys(source[curKey]));}console.log(curKey)}return target;}
