当前位置: 首页 > article >正文

对象数组按照指定rule对数据进行切割分层形成树形结构并支持搜索功能

根据提供的对象数组,按照rule: '5-3-3’的规则对数据进行分层,形成树形结构并支持搜索功能
数据:
dataList: [
{ id: ‘10000’, name: ‘a’ },
{ id: ‘10000001’, name: ‘a1’ },
{ id: ‘10000001001’, name: ‘a1c’ },
{ id: ‘20000’, name: ‘b’ },
{ id: ‘20000002’, name: ‘b1’ }
]

效果: 在这里插入图片描述

<template>
  <div id="app">
    <!-- 搜索框 -->
    <el-input
      placeholder="请输入搜索内容"
      v-model="filterText"
      @input="onFilterInput"
      clearable
    >
      <template #append>
        <el-button icon="el-icon-search"></el-button>
      </template>
    </el-input>

    <!-- 树形结构 -->
    <el-tree
      :data="treeData"
      :props="defaultProps"
      :filter-node-method="filterNode"
      ref="tree"
      @node-click="handleNodeClick"
    ></el-tree>
  </div>
</template>

<script>
export default {
  name: 'App',
  data() {
    return {
      // 动态规则,例如 "5-3-3"
      rule: '5-3-3',
      // 动态数据列表,现在是对象数组
      dataList: [
        { id: '10000', name: 'a' },
        { id: '10000001', name: 'a1' },
        { id: '10000001001', name: 'a1c' },
        { id: '20000', name: 'b' },
        { id: '20000002', name: 'b1' }
      ],
      treeData: [], // 将会填充的树形结构数据
      defaultProps: {
        children: 'children',
        label: 'label'
      },
      filterText: '' // 搜索关键字
    };
  },
  created() {
    this.generateTree();
  },
  methods: {
    generateTree() {
      const segments = this.rule.split('-').map(Number);
      const root = {};
      const idsToNames = new Map(this.dataList.map(item => [item.id, item.name]));

      this.dataList.forEach(({ id }) => {
        let node = root;
        let start = 0;
        for (let i = 0; i < segments.length; i++) {
          const end = start + segments[i];
          const segment = id.slice(start, end);
          if (!node[segment]) {
            node[segment] = { label: idsToNames.get(id), children: {} };
          }
          if (end === id.length) break; // 如果已经到达ID的末尾,则停止
          node = node[segment].children;
          start = end;
        }
      });

      function toTreeArray(node) {
        return Object.keys(node).map(key => ({
          ...node[key],
          children: toTreeArray(node[key].children)
        })).filter(item => item.label !== undefined);
      }

      this.treeData = toTreeArray(root);
    },
    handleNodeClick(data) {
      console.log('Node clicked:', data);
    },
    onFilterInput() {
      this.$refs.tree.filter(this.filterText);
    },
    filterNode(value, data) {
      if (!value) return true;
      return data.label.indexOf(value) !== -1;
    }
  },
  watch: {
    // 监听规则或数据的变化以重新生成树
    rule: 'generateTree',
    dataList: {
      handler: 'generateTree',
      deep: true
    }
  }
};
</script>

<style>
/* 添加样式 */
</style>


http://www.kler.cn/a/504184.html

相关文章:

  • pytorch张量分块投影示例代码
  • 王炸组合:Dolphinscheudler 3.1.*搭配SeaT unnel2.3.*高效完成异构数据数据集成
  • 接口测试Day09-数据库工具类封装
  • 分布式数据存储基础与HDFS操作实践(副本)
  • 【Uniapp-Vue3】showLoading加载和showModal模态框示例
  • 分布式缓存redis
  • 稀疏矩阵:BM25;稠密矩阵:RoBERTa - wwm - ext顺序
  • 目标客户营销(ABM)结合开源AI智能名片2+1链动模式S2B2C商城小程序的策略与实践
  • 二进制、八进制、十进制和十六进制的相互转换
  • 力扣经典题目之55.跳跃游戏
  • lwip单网卡多ip的实现
  • Python海龟绘图库:从入门到精通 - Python官方文档(三万字解析!)
  • Ubuntu20.04复现GraspNet全记录(含遇到的问题及解决方法
  • C语言——动态内存管理
  • pytorch小记(五):pytorch中的求导操作:backward()
  • 向u-boot提交补丁的流程
  • 【高可用自动化体系】自动化体系
  • [NOIP2007 提高组] 矩阵取数游戏
  • 如何物理连接Franka机械臂
  • 【Vim Masterclass 笔记14】S07L29 + L30:练习课08 —— Vim 文本对象同步练习(含点评课内容)
  • 分布式缓存redis
  • IDM-VTON效果测试
  • JavaScript中如何实现函数签名
  • 25/1/14 算法笔记<强化学习> CBR加强化学习
  • 容器技术全面攻略:Docker的硬核玩法
  • 从零到一:用 Flask 和 Docker 构建并部署一个简单的接口请求页面