把树状数组在页面显示成‘/‘/‘形式,并搜索想要的值

这篇具有很好参考价值的文章主要介绍了把树状数组在页面显示成‘/‘/‘形式,并搜索想要的值。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

大概思路

在Vue中,若要将树状数组以类似于文件路径的形式(即“/”分隔)显示在页面上,可以按照以下步骤操作:

首先,假设您有一个树状数组,其结构可能如下所示:

const treeData = [
  {
    name: 'root',
    children: [
      {
        name: 'folder1',
        children: [
          { name: 'file1' },
          { name: 'file2' },
        ],
      },
      {
        name: 'folder2',
        children: [
          { name: 'file3' },
        ],
      },
    ],
  },
];

接下来,在Vue组件中,您可以编写一个计算属性或方法来递归地处理这个树形结构并将其转换为包含路径的扁平数组:

<template>
  <ul>
    <li v-for="item in filePaths" :key="item.id">{{ item.path }}</li>
  </ul>
</template>

<script>
import { ref, computed } from 'vue';

export default {
  props: {
    treeData: {
      type: Array,
      required: true,
    },
  },
  setup(props) {
    // 创建一个ref来存储转换后的路径数组
    const filePaths = ref([]);

    // 计算属性或生命周期钩子中处理树形数据
    function flattenTree(node, path = '') {
      let newPath = `${path}/${node.name}`;

      // 将带有路径的节点加入数组
      filePaths.value.push({ id: node.id || node.name, path: newPath });

      // 如果有子节点,则递归处理
      if (Array.isArray(node.children)) {
        node.children.forEach(child => {
          flattenTree(child, newPath);
        });
      }
    }

    // 遍历并处理原始树形数据
    props.treeData.forEach(rootNode => {
      flattenTree(rootNode);
    });

    // 返回filePath以便在模板中使用
    return {
      filePaths,
    };
  },
};
</script>

这段代码首先定义了一个计算属性 filePaths,然后通过 flattenTree 函数递归地遍历树状数组并将每条路径添加到 filePaths 中。最后,在模板中,我们通过 v-for 指令遍历 filePaths 并显示每一条路径。这样,在页面上就会看到以 '/' 分隔的路径形式展示了树状数组的内容。当然,请确保根据实际数据结构调整 name 和 children 字段名以及 id 或任何唯一键的生成逻辑。

简写

对于Vue3,我们可以使用Composition API来实现这个功能。以下是将树状数组转换为路径并在Vue3组件中展示的示例:

<template>
  <div>
    <ul>
      <li v-for="item in displayedFilePaths" :key="item.id">{{ item.path }}</li>
    </ul>
  </div>
</template>

<script setup>
import { ref, computed, onMounted } from 'vue';

// 假设这是从外部获取或props传递过来的树状数据
const treeData = ref([
  {
    id: 'root',
    name: 'root',
    children: [
      {
        id: 'folder1',
        name: 'folder1',
        children: [
          { id: 'file1', name: 'file1' },
          { id: 'file2', name: 'file2' },
        ],
      },
      {
        id: 'folder2',
        name: 'folder2',
        children: [
          { id: 'file3', name: 'file3' },
        ],
      },
    ],
  },
]);

// 存储转换后的路径数组
const displayedFilePaths = ref([]);

// 用于处理树形数据的方法
function flattenTree(node, path = '/') {
  const newPath = `${path}/${node.name}`;

  displayedFilePaths.value.push({ id: node.id, path: newPath });

  if (Array.isArray(node.children)) {
    node.children.forEach(child => {
      flattenTree(child, newPath);
    });
  }
}

// 在组件挂载后执行处理函数
onMounted(() => {
  treeData.value.forEach(node => {
    flattenTree(node);
  });
});
</script>

在这个例子中,我们使用了Vue3的 <script setup> 特性来简化组件脚本部分。首先,我们定义了一个名为 treeData 的响应式引用,并在组件挂载时遍历它,调用 flattenTree 方法将树状结构转换为包含路径的 displayedFilePaths 数组。然后在模板中通过 v-for 循环展示这些路径。请注意,这里假设每个节点都有一个唯一的 id 属性,实际应用中请按实际情况调整字段名。

往flattenTree传入一个值,那这值跟最后一个节点比,显示出含这值的

如果要在flattenTree函数中传入一个值,然后找到并显示包含该值的路径,可以修改flattenTree函数使其返回包含目标值的路径数组。下面是如何修改Vue3组件以实现这一需求

<template>
  <div>
    <ul>
      <li v-if="matchedPaths.length > 0" v-for="item in matchedPaths" :key="item.id">{{ item.path }}</li>
      <p v-else>未找到与{{ searchValue }}匹配的路径</p>
    </ul>
  </div>
</template>

<script setup>
import { ref, onMounted } from 'vue';

const treeData = ref([...]); // 你的树状数据
const searchValue = ref(''); // 搜索值
const matchedPaths = ref([]); // 匹配的路径

function flattenTree(node, path = '/', matchedList = []) {
  const newPath = `${path}/${node.name}`;

  // 如果节点名字包含了搜索值,将路径添加到匹配列表
  if (node.name.includes(searchValue.value)) {
    matchedList.push({ id: node.id, path: newPath });
  }

  if (Array.isArray(node.children)) {
    node.children.forEach(child => {
      flattenTree(child, newPath, matchedList);
    });
  }

  // 返回匹配列表
  return matchedList;
}

onMounted(() => {
  // 当搜索值改变时,更新匹配的路径
  searchValue.value = '你要搜索的值'; // 替换为实际的搜索值
  matchedPaths.value = flattenTree(treeData.value[0]);
});

// 如果需要实时搜索,可以监听searchValue的变化
watch(searchValue, newValue => {
  matchedPaths.value = flattenTree(treeData.value[0]);
});
</script>

现在,当向flattenTree函数传入搜索值时(这里是在onMounted期间初始化),它将返回包含目标值的路径数组。同时,通过watch侦听searchValue的变化,每当搜索值更改时,都会重新计算并显示匹配的路径。

拿到了/一/二/三 去除/变成数组拿到最后一个,拿最后一个去搜索想要的值

let str = "/一/二/三";

// 将字符串分割成数组
let arr = str.split('/');

// 去除首尾的空白字符串或特定字符(这里是"/")
arr = arr.filter(item => item.trim());

// 获取最后一个元素
let lastElement = arr[arr.length - 1];

console.log(lastElement); // 输出:"三"

这段代码首先使用split()方法按"/"将字符串分割成数组,然后使用filter()去除数组中的空元素(这里因前后都有"/",所以会出现空字符串元素),最后通过数组索引获取最后一个元素。文章来源地址https://www.toymoban.com/news/detail-794038.html

到了这里,关于把树状数组在页面显示成‘/‘/‘形式,并搜索想要的值的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 树状数组

    「观前提醒」 「文章仅供学习和参考,如有问题请在评论区提出」 目录 定义 基本概念 基本原理 单点修改 分析 代码实现 区间查询 分析 代码实现 整体代码 练手题目 小结 参考资料 树状数组 是一种支持 单点修改 和 区间查询 的数据结构。 普通的树状数组 只能用来维护像

    2024年02月16日
    浏览(35)
  • 超详细の树状数组讲解!

    以下有错误的话欢迎指正 由于篇幅问题每道题目的代码在每一板块最后折叠给出 其实线段树能维护的东西比树状数组能维护的东西多得多,但是树状数组代码好写啊! 最为常用的树状数组,我们一般都是用这个来解决问题,二维的后面会讲。 我们在进行数列操作的时候,经

    2024年02月07日
    浏览(34)
  • 【算法】树状数组和线段树

    O ( l o g n ) O(logn) O ( l o g n ) :单点修改、区间查询 与前缀和的区别: 前缀和是离线的,每次动态修改原数组某个元素,都需要重新求一遍前缀和,因此单点修改是 O ( n ) O(n) O ( n ) 的,区间查询则是 O ( 1 ) O(1) O ( 1 ) 树状数组是在线的,单点修改和区间查询都是 O ( l o g n ) O(

    2024年02月19日
    浏览(47)
  • 数据结构<1>——树状数组

    前言:树状数组能解决的问题线段树一定可以解决。然后关于线段树的内容会在2中讲解。 树状数组,也叫Fenwick Tree和BIT(Binary Indexed Tree),是一种支持 单点修改 和 区间查询 的,代码量小的数据结构。 那神马是单点修改和区间查询?我们来看一道题。 洛谷P3374(模板): 在本题中

    2024年01月25日
    浏览(61)
  • 树状数组练习题

    为什么大佬们一眼看出是树状数组呢? 不是一眼看出树状数组,而是 要把 【找两个相邻的最小值之间还有几个数没删掉】 的问题转变成动态区间和问题,这个转化过程才是最重要的 , 至于你用什么数据结构求动态区间和是次要的,很多数据结构都能做,最常用的树状数组

    2024年02月03日
    浏览(39)
  • 深入理解树状数组

    树状数组(BIT, Binary Indexed Tree)是简洁优美的数据结构,它能在很少的代码量下支持 单点修改 和 区间查询 ,我们先以 a[] {1, 2, 3, 4, 5, 6} 数组为例建立树状数组看一下树状数组的样子: 可以发现:不是所有节点都是连接在一起的,c[1], c[2], c[3], c[4] 和 c[5], c[6] 分别构成了两棵

    2024年02月08日
    浏览(39)
  • 首页搜索框传递参数,并在搜索页面中的搜索框中进行显示,搜索框绑定回车键进行搜索

    1.写出搜索条件和搜索框 2.添加scss样式 页面 3.搜索框选择条件,在搜索框中输入内容,然后进行页面跳转 在搜索框中输入内容,然后进行页面跳转 4.页面跳转后从地址栏中获取相关数据,搜索条件和搜索框中的内容 从地址栏中获取到相关数据searchText和selectSearch的值

    2024年02月10日
    浏览(100)
  • 243. 一个简单的整数问题2(树状数组)

    输入样例: 输出样例:  解析:         一般树状数组都是单点修改、区间查询或者单点查询、区间修改。这道题都是区间操作。                    1. 区间修改用数组数组维护差分数组         2. 区间查询,需要log计算两个端点的前缀和。上图右侧,可以得出,计算

    2024年02月14日
    浏览(38)
  • 《算法竞赛进阶指南》0x42 树状数组

    题意: 二维平面给定一些点,询问 v 形和 ∧ 形数目 解析: 对于 ∧ 形: ( i , y ) (i,y) ( i , y ) ,考虑左右两侧比该点低的点的个数。树状数组查询 y j y y_j y y j ​ y 的点的个数。因为总共有 y − 1 y-1 y − 1 个点比当前点低,有 n − y n-y n − y 个点比当前点高。 v型同理。 代码

    2023年04月11日
    浏览(40)
  • java通过stream流的形式把列表中某个字段的值取出并生成列表

    可以使用Java 8中引入的Stream API来实现这一功能。例如,假设你有一个类名为Person的列表,并且你想要从这个列表中提取所有人的姓名并生成一个新的列表。你可以这样做: 这段代码首先使用 stream() 方法将列表转换为流。然后,使用 map() 方法对流中的每个元素执行一个转换函

    2024年02月12日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包