当前位置:首页 > 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实现验证码

实现验证码的JavaScript方法 生成随机验证码 使用Math.random()生成随机字符串,结合数字和字母: function generateCaptcha() { const cha…

js实现验证

js实现验证

验证表单输入 使用JavaScript验证表单输入是常见的需求。可以通过监听表单提交事件,检查输入字段是否符合要求。 document.getElementById('myForm').addEve…

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式系…

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…

使用js实现

使用js实现

使用JavaScript实现 JavaScript可以通过Math.random()函数生成随机数,结合其他方法可以实现多种随机数生成需求。 // 生成0到1之间的随机小数 const random…

js图片轮播的实现

js图片轮播的实现

基础图片轮播实现 使用HTML、CSS和JavaScript实现一个简单的图片轮播效果。HTML部分定义轮播容器和图片,CSS负责样式和过渡效果,JavaScript处理逻辑。 <div cl…