原数据:
const treeData = [
{
id: 1,
label: "一级 1",
children: [
{
id: 4,
label: "二级 1-1",
children: [
{
id: 9,
label: "三级 1-1-1",
},
{
id: 10,
label: "三级 1-1-2",
},
],
},
],
},
{
id: 2,
label: "一级 2",
children: [
{
id: 5,
label: "二级 2-1",
},
{
id: 6,
label: "二级 2-2",
},
],
},
{
id: 3,
label: "一级 3",
children: [
{
id: 7,
label: "二级 3-1",
},
{
id: 8,
label: "二级 3-2",
},
],
},
];
需求一:获取treeData中属性id的数组集合
const getIdArr = findValueByKey(treeData, “id”);
console.log("getIdArr: ", getIdArr); //getIdArr: (10) [9, 10, 4, 1, 5, 6, 2, 7, 8, 3]
// 需求一:获取treeData中属性id的数组集合
const findValueByKey = (data, id) =>
data.reduce((preData, item) => {
let result = []
if (item?.children?.length > 0) {
result = findValueByKey(item.children, id)
}
if (item?.[id]) return [...preData, ...result, item[id]]
else return [...preData, ...result]
}, [])
console.log(findValueByKey(treeData, 'id'))
需求二:根据id获取当前id节点信息
const getNodeById = findNodeById(treeData, 8);
console.log("getNodeById: ", getNodeById); // {id: 8, label: ‘二级 3-2’}
// 需求二:根据id获取当前id节点信息
const findNodeById = (data, id) => {
let result
for (let item of data) {
if (item?.id === id) return item
if (item?.children?.length > 0) {
result = findNodeById(item.children, id)
if (result) return result
}
}
return result
}
console.log(findNodeById(treeData, 8))
需求三:根据属性关键字获取当前深度节点信息
const searchKey = treeSearch(treeData, “1-2”, “label”);
console.log("searchKey: ", searchKey);
// [{
// id: 1,
// label: “一级 1”,
// children: [
// {
// id: 4,
// label: “二级 1-1”,
// children: [
// {
// id: 10,
// label: “三级 1-1-2”,
// },
// ],
// },
// ],
// }]
// 需求三:根据属性关键字获取当前深度节点信息
const treeSearch = (data, search, key) => {
return data.reduce((preData, item) => {
if (item?.children?.length) {
item.children = treeSearch(item.children, search, key)
if (item.children?.length) return [...preData, item]
if (item?.[key].includes(search)) {
item.children = []
return [...preData, item]
}
return [...preData]
}
if (item?.[key].includes(search)) return [...preData, item]
return [...preData]
}, [])
}
console.log(treeSearch(treeData, '1-2', 'label'))
需求四: 根据回调函数处理树结构节点信息,返回新的树形结构
const editTree = operateTreeData(treeData, function (node) {
node.key = node.id;
node.value = ${node.id}
;
node.title = node.name;
node.selectable = true;
return node;
});
console.log("editTree: ", editTree);
(3) [{…}, {…}, {…}]
0:
children: [{…}]
id: 1
key: 1
label: “一级 1”
level: 0
selectable: true
title: undefined
value: “1”
1: {id: 2, label: ‘一级 2’, children: Array(2), level: 0, key: 2, …}
2: {id: 3, label: ‘一级 3’, children: Array(2), level: 0, key: 3, …}
// 需求四: 根据回调函数处理树结构节点信息,返回新的树形结构
const operateTreeData = (data, callback) => {
return data.reduce((preData, item) => {
if (item?.children?.length > 0) {
item.children = operateTreeData(item.children, callback)
}
item = callback(item)
return [...preData, item]
}, [])
}
console.log(
operateTreeData(treeData, node => {
node.key = node.id
node.value = `${node.id}`
node.title = node.label
node.selectable = true
return node
})
)