js树形数据处理

这篇博客介绍了如何在JavaScript中处理树形数据结构。包括获取所有节点的id数组、根据id查找节点、根据属性关键字搜索节点以及使用回调函数修改树节点信息的方法。这些方法在前端开发中处理数据和构建组件时非常实用。
摘要由CSDN通过智能技术生成

原数据:

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
  })
)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值