当前位置:首页 > JavaScript

js实现树形

2026-01-31 22:58:51JavaScript

js实现树形结构的方法

递归法

递归是构建树形结构的常见方法。通过递归函数可以遍历嵌套的数据结构,生成树形视图。

function buildTree(data, parentId = null) {
  const tree = [];
  data.forEach(item => {
    if (item.parentId === parentId) {
      const children = buildTree(data, item.id);
      if (children.length > 0) {
        item.children = children;
      }
      tree.push(item);
    }
  });
  return tree;
}

非递归法

使用对象映射可以提高性能,特别适合大数据量的树形结构构建。

function buildTreeWithMap(data) {
  const map = {};
  const tree = [];

  data.forEach(item => {
    map[item.id] = { ...item, children: [] };
  });

  data.forEach(item => {
    if (item.parentId && map[item.parentId]) {
      map[item.parentId].children.push(map[item.id]);
    } else {
      tree.push(map[item.id]);
    }
  });

  return tree;
}

使用第三方库

一些成熟的库如lodashd3-hierarchy等提供了树形结构处理的工具函数。

import { groupBy, mapValues } from 'lodash';

function buildTreeWithLodash(data) {
  const grouped = groupBy(data, 'parentId');
  const tree = mapValues(grouped, items => 
    items.map(item => ({
      ...item,
      children: grouped[item.id] || []
    }))
  );
  return tree[null] || [];
}

树形结构的渲染方法

递归组件

在Vue/React等框架中可以使用递归组件渲染树形结构。

function TreeNode({ node }) {
  return (
    <li>
      {node.name}
      {node.children && (
        <ul>
          {node.children.map(child => (
            <TreeNode key={child.id} node={child} />
          ))}
        </ul>
      )}
    </li>
  );
}

虚拟滚动优化

对于大型树形结构,虚拟滚动可以提高性能。

import { FixedSizeTree } from 'react-vtree';

function Tree({ treeData }) {
  const treeWalker = function* () {
    for (let node of treeData) {
      yield {
        id: node.id,
        data: node,
        isOpen: true,
        nestingLevel: 0
      };
    }
  };

  return (
    <FixedSizeTree
      treeWalker={treeWalker}
      itemSize={30}
      height={500}
      width={300}
    />
  );
}

树形结构的操作

添加节点

function addNode(tree, newNode, parentId) {
  if (tree.id === parentId) {
    tree.children = tree.children || [];
    tree.children.push(newNode);
    return true;
  }

  if (tree.children) {
    for (let child of tree.children) {
      if (addNode(child, newNode, parentId)) {
        return true;
      }
    }
  }

  return false;
}

删除节点

function removeNode(tree, nodeId) {
  if (tree.children) {
    tree.children = tree.children.filter(child => child.id !== nodeId);
    for (let child of tree.children) {
      removeNode(child, nodeId);
    }
  }
}

查找节点

function findNode(tree, nodeId) {
  if (tree.id === nodeId) {
    return tree;
  }

  if (tree.children) {
    for (let child of tree.children) {
      const found = findNode(child, nodeId);
      if (found) return found;
    }
  }

  return null;
}

性能优化建议

使用对象映射替代递归查找可以提高性能。对于静态树形结构,可以考虑预计算路径或层级关系。

大型树形结构应考虑分页加载或虚拟滚动技术。避免直接操作DOM,使用框架的响应式机制更新视图。

js实现树形

Immutable数据结构有助于优化渲染性能,特别是在React等框架中。

标签: js
分享给朋友:

相关文章

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。 &…

js实现 功能

js实现 功能

在 JavaScript 中实现功能通常涉及多个关键步骤,具体取决于功能需求。以下是常见功能的实现方法和示例: 基本功能实现 使用函数封装逻辑是最直接的方式。例如,实现一个计算两数之和的函数: f…

js实现按钮点击

js实现按钮点击

实现按钮点击的JavaScript方法 HTML按钮元素 在HTML中创建按钮元素,为其添加id或class以便JavaScript选择: <button id="myButton">点…

js 实现递归

js 实现递归

递归的基本概念 递归是指函数直接或间接调用自身的过程。在JavaScript中,递归通常用于解决可以分解为相似子问题的问题,如阶乘、斐波那契数列、树形结构遍历等。 递归的实现要点 基线条件(Base…

js实现div隐藏

js实现div隐藏

使用CSS的display属性隐藏div 通过设置元素的display属性为none,可以完全隐藏div元素。这种方法不仅隐藏元素,还会从文档流中移除,不占据页面空间。 document.getEl…

vue.js实现checkbox

vue.js实现checkbox

使用 v-model 绑定复选框 在 Vue.js 中,可以通过 v-model 指令实现复选框的双向数据绑定。复选框的值会与 Vue 实例中的数据属性同步。 <template>…