我们每次编写一个方法都要考虑是否可以公用,看是否所有的数据结构都能适用这方法
1.比如我们此时的数据结构如下
let list = [
{
label: "B2B",
parentId: "0",
value: "CH03",
},
{
label: "智能家居",
parentId: "CH03",
value: "CH03002",
},
{
label: "地产代理",
parentId: "CH03002",
value: "CH03002002",
},
{
label: "公寓代理",
parentId: "CH03002",
value: "CH03002002",
},
{
label: "区域连锁",
parentId: null,
value: "CH07",
},
{
label: "区域连锁",
parentId: "CH07",
value: "CH07001",
},
{
label: "分支",
parentId: "CH07001",
value: "CH07001002",
},
{
label: "分支2",
parentId: "CH07001",
value: "CH07001002",
},
];
公共方法编写如下
* @param {*} array 传入的数组
* @param {*} getParentId 传入一个函数 获取父亲的ID 唯一标识
* @param {*} key 父亲的唯一标识
* @param {*} childKey 默认child名字数组
/**
*
* @param {*} array 传入的数组
* @param {*} getParentId 传入一个函数 获取父亲的ID 唯一标识
* @param {*} key 父亲的唯一标识
* @param {*} childKey 默认child名字数组
* @returns
*/
function trees(array, getParentId, key = "id", childKey = "child") {
const pool = [...array].reverse(); //浅拷贝在翻转
const trees = [];
const rootMap = {};
const nodeMap = {};
let count = 0;
let item;
for (let i = 0; i < array.length; i++) {
nodeMap[array[i][key]] = array[i]; //这里可以理解为浅拷贝,共享引用
}
while ((item = pool.pop())) {
const parentId = getParentId(item); //找到pool中每一项item的父亲ID
if (!parentId || !nodeMap[parentId]) {
trees.push(item);
rootMap[item[key]] = item;
} else {
if (rootMap[parentId]) {
//说明元素有父亲,把元素放在父亲的childKey下面
rootMap[parentId][childKey] = rootMap[parentId][childKey] || [];
rootMap[parentId][childKey].push(item);
rootMap[item[key]] = item;
} else {
//说明元素没有父亲,是根节点,向数组的开头添加一个
pool.unshift(item);
}
}
}
return trees;
}
使用如下
const getParentId = (item) => item.parentId; //写一个函数获取对应的父亲ID
let testList = trees(list, getParentId, "value");
console.log("testList", testList);