【js】将一维数组处理成树形数据并且实现模糊查询

ops/2024/10/19 7:27:01/

项目中由于数据量不大,后台并未做处理,因此前端拿到返回的Table数据需要处理成树形数据再渲染到表格中

  • 原始数据
javascript">const dataList=[{"id": 44,"seedlingName": "测试2","seedlingType": "测试2","seedlingAge": 2,},{"id": 47,"seedlingName": "试","seedlingType": "1","seedlingAge": 1,},{"id": 45,"seedlingName": "试2","seedlingType": "2","seedlingAge": 2,},{"id": 43,"seedlingName": "试1","seedlingType": "12","seedlingAge": 12,},{"id": 49,"seedlingName": "试1","seedlingType": "1","seedlingAge": 222,},{"id": 50,"seedlingName": "试1","seedlingType": "试1","seedlingAge": 1,},{"id": 46,"seedlingName": "测试2","seedlingType": "测试3","seedlingAge": 3,},{"id": 42,"seedlingName": "测试2","seedlingType": "12","seedlingAge": 12,}
]
  • 处理之后的数据(这里是按照名称做的归类[seedlingName])
javascript">const dataList=[{"id": 44,"seedlingName": "测试2","seedlingType": "测试2","seedlingAge": 2,"children": [{"id": 46,"seedlingName": "测试2","seedlingType": "测试3","seedlingAge": 3,   },{"id": 42,"seedlingName": "测试2","seedlingType": "12","seedlingAge": 12,}]},{"id": 47,"seedlingName": "试","seedlingType": "1","seedlingAge": 1,"children": []},{"id": 45,"seedlingName": "试2","seedlingType": "2","seedlingAge": 2,"children": []},{"id": 43,"seedlingName": "试1","seedlingType": "12","seedlingAge": 12,"children": [{"id": 49,"seedlingName": "试1","seedlingType": "1","seedlingAge": 222,},{"id": 50,"seedlingName": "试1","seedlingType": "试1","seedlingAge": 3,}]}
]

思路

备注:由于处理完之后会影响到原始数据,所以不能直接赋值,做一下数据的拷贝 _.cloneDeep()

1. 先用map结构记录

javascript">function arrayToMap(data) {var map = {};for (var i = 0; i < data.length; i++) {let name = data[i].seedlingName;if (name != undefined) {if (map[name] == undefined) {map[name] = [];}map[name].push(data[i]);}}return map;}

2. 把map转成数组

javascript">//把map转成数组function mapToArray(data) {let array = [];for (let p in data) {array.push(data[p]);}return array;}

3. 循环之后取出每一个数组第一个元素作为根节点,后面的作为子级

javascript">function arrayToTree(array) {// 取出第一个元素作为根节点const root = array.shift();if (array.length) {root.children = array;} else {root.children = [];}return root;}

4. 调用

javascript">const treeArr = mapToArray(arrayToMap(dataList)).map((item) => {var tree = arrayToTree(item);return tree;});console.log(treeArr)

5. 实现模糊查询

这里查询的字段(seedlingName/seedlingAge/seedlingType),其中seedlingAge是数字类型,所以我在查询的时候将数字类型转成了字符串类型,使用indexOf实现此功能,然后将查询到的数据在转成树形结构

javascript">const tableFilter=ref([])
const selectParams = reactive({seedlingName: '',seedlingType: '',seedlingAge: '',
});tableFilter.value = _.cloneDeep(dataList); //dataList原始数据getFuzzyQuery(selectParams);const getFuzzyQuery = (params) => {const filterVal = tableFilter.value.filter((item) => {if (item.seedlingName.indexOf(params.seedlingName) !== -1 &&item.seedlingType.indexOf(params.seedlingType) !== -1 &&item.seedlingAge.toString().indexOf(params.seedlingAge) !== -1) {return item;}});tableData.value = getDisposeData(filterVal); //getDisposeData是将上面的处理封装了
};

效果图:

原始数据展示的表格:
在这里插入图片描述
处理完之后展示的表格
在这里插入图片描述


http://www.ppmy.cn/ops/38876.html

相关文章

第18讲:Ceph集群CrushMap的核心概念、默认规则与完整定义

文章目录 1.CrushMap核心概念2.集群默认的CrushMap规则剖析2.1.CrushMap列表显示内容剖析2.2.对默认的CrushMap规则进行深度的剖析2.3.完整的CrushMap定义信息 1.CrushMap核心概念 CrushMap官方文档&#xff1a;https://docs.ceph.com/en/pacific/rados/operations/crush-map/…

Linux的命令

&#xff1b; 昨天学习了七个命令&#xff0c;分别是&#xff1a;cd命令&#xff08;切换目录&#xff09;、pwd命令&#xff08;当前目录&#xff09;、mkdir命令&#xff08;创建目录&#xff09;、touch命令&#xff08;创建文件&#xff09;、date命令&#xff08;显…

面试算法之哈希专题

赎金信 class Solution { public:bool canConstruct(string ransomNote, string magazine) {// 小写字母int r_cnt[26];int m_cnt[26];for(int i 0; i< magazine.size(); i) {m_cnt[magazine[i]-a]; // 统计}// 对比for(int i 0; i< ransomNote.size(); i) {if(m_cnt[r…

【一起深度学习——沐的Resnet】

沐神的Resnet 原理图&#xff1a;实现&#xff1a;定义残差块&#xff1a;定义Resnet模型&#xff1a;运行测试&#xff1a;输出结果&#xff1a; 原理图&#xff1a; 实现&#xff1a; 定义残差块&#xff1a; class Residual(nn.Module):def __init__(self,input_channels,…

Spark云计算平台Databricks使用,第一个Spark应用程序WordCount

1 上传文件 上传words.txt文件&#xff1a;Spark云计算平台Databricks使用&#xff0c;上传文件-CSDN博客 上传的文件的路径是/FileStore/tables/words.txt&#xff0c;保存在AWS的S3 hello world hello hadoop hello world hello databricks hadoop hive hbase yarn spark …

自存angular 自定义snackbar

定义 1.自定义样式 2.自定义组件 就在要使用snackbar的组件中 在module中引入该组件&#xff08;重新写一个组件也行的 直接引入就好&#xff09; 打开这个组件 给这个自定义的组件传参 这个自定义组件接参(类似对话框接参) 使用参数 在这个自定义组件中 做了点击如何关闭s…

【Linux】Centos7配置JDK

1.启动虚拟机、Xshell、Xftp 2.在Xshell中新建一个会话&#xff0c;用于连接到虚拟机中 3.因为虚拟机里自带有JDK&#xff0c;所以需要先卸载自带的JDK 3.1.查询已安装的 jdk 列表 rpm -qa | grep jdk3.2.将查询到的全部删除 yum -y remove XXX&#xff08;上面查询到的 j…

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第18课-购买头榜解密文件锁

【WEB前端2024】开源智体世界&#xff1a;乔布斯3D纪念馆-第18课-购买头榜解密文件锁 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世…