对于递归,算法当中根底中的根底,把握不好,所有算法都是0.
以下是几个递归,在了解当中记忆,记录它们重在了解,不在记忆。
1、多维数组打成map映射。
const buildMapDataSource = ( dataSource, target = {}, level = 1, parentKey = null,) => { for (let i = 0; i < dataSource.length; i++) { const item = dataSource[i]; let key = !parentKey ? `${i}` : `${parentKey}-${i}`; if (!target[item.id]) { target[item.id] = item; item.level = level; item.key = key; } if (Array.isArray(item?.children)) { buildMapDataSource(item.children, target, level + 1, key); } } return target;};
2、多维数组,每项打入key,示意层级,相似key='0-0-0-1'.
const buildStandardArr = (data, parentId = null) => { const result = []; data.forEach((item, index) => { if (item.parentId === parentId) { const key = parentId !== null ? `${parentId}-${index}` : `${index}`; const newItem = { ...item, key }; const children = buildStandardArr(data, item.id); if (Array.isArray(children) && children.length) { newItem.children = children; } result.push(newItem); } }); return result;}
3、把一维打成tree多维,集体感觉这个比拟难了解;
const buildMultipleArr = (data, parentId = null) => { const result = []; data.forEach(item => { if (item.parentId === parentId) { const children = buildMultipleArr(data, item.id); const newItem = { ...item }; if (Array.isArray(children) && children.length) { newItem.children = children; } result.push(newItem); } }); return result;};
4、通过parentId获取parent
const getParent = (data, parentId = null, parent = null) => { for (let i = 0; i < data.length; i++) { const item = data[i]; if (item.parentId === parentId) { return parent; } if (Array.isArray(item?.children) && item.children.length) { const parent = getParent(item.children, parentId, item); if (parent) { return parent; } } } return null;}
5、对多维数组,外部的节点排序
const sortNodes = (data) => { data.sort((a, b) => a.sort - b.sort) data.forEach(item => { if (Array.isArray(item?.children) && item.children.length) { sortNodes(item.children); } }); return data;}
6、获取多维数组,某一项Item外部(有多层children嵌套)最大的层级
const getMaxLevel = (obj) => { let maxLevel = 0; function traverse(node, level) { if (level > maxLevel) { maxLevel = level; } if (Array.isArray(node.children)) { node.children.forEach(child => { traverse(child, child.level); }); } } traverse(obj, obj.level); return maxLevel;}
从下面的例子来看
须要数组push的,都是先写递归函数,再写push追加的内容
须要返回一个object的,都是先写逻辑,再写递归函数