简单示例:

需求:输入 “题2” 字,希望树形结构中带有 “题2” 字的项显示,即使父节点没有,但子节点含有,父节点仍要返回。

let arr = [
{
title: '标题1',
children: [
{
title: '标题11',
children: null
},
{
title: '标题21',
children: null
}
]
},
{
title: '标题2',
children: [
{
title: '标题22',
children: null
}
]
},
{
title: '标题3',
children: null
}
];

代码实现:

let mapTree = (value, arr) => {
let newarr = [];
arr.forEach(element => {
if (element.title.indexOf(value) > -1) { // 判断条件
newarr.push(element);
} else {
if (element.children && element.children.length > 0) {
let redata = mapTree(value, element.children);
if (redata && redata.length > 0) {
let obj = {
...element,
children: redata
};
newarr.push(obj);
}
}
}
});
return newarr;
}; console.log(mapTree('题2', arr));

结果:

[
{
title: '标题1',
children: [
{
title: '标题21',
children: null
}
]
},
{
title: '标题2',
children: [
{
title: '标题22',
children: null
}
]
}
]

复杂示例:

如果需要匹配多个属性,代码实现如下:

matchTreeData(arr, searchCon) {
let newArr = [];
let searchNameList = ['name', 'code', 'title'];
arr.forEach((item) => {
for (let i = 0, len = searchNameList.length; i < len; i++) {
let nameKey = searchNameList[i];
if (item.hasOwnProperty(nameKey)) {
if (item[nameKey] && item[nameKey].indexOf(searchCon) !== -1) {
newArr.push(item);
break;
} else {
if (item.childList && item.childList.length > 0) {
let resultArr = this.matchTreeData(item.childList, searchCon);
if (resultArr && resultArr.length > 0) {
newArr.push({
...item,
childList: resultArr
})
break;
}
}
}
} else {
continue;
}
}
})
return newArr;
}

JS实现树形结构数据的模糊搜索查询的更多相关文章

  1. 前端js重组树形结构数据方法封装

    不知道大家平时工作中,有没有遇到这样一种情况:后端接口返回的数据,全都是一维的数组,都是平铺直叙式的数据,业务需求却要你实现树形结构的功能.那么,针对这种情况该怎么办呢?是跟后台好好沟通一下呢,还是沟 ...

  2. js返回树形结构数据

    /** * 树形结构转换 * @param a * @param idStr * @param pidStr * @param chindrenStr * @returns {Array} */ fu ...

  3. js将有父子关系的数据转换成树形结构数据

    js将有父子关系的数据转换成树形结构数据 比如如下基本数据: let allDatas = [ { id: 3, name: 'bbbb', parendId: 1 }, { id: 2, name: ...

  4. 【Tree 3】树形结构数据加载的思考

    前面两篇文章,分别介绍了使用递归和非递归算法加载树形结构数据的方式,本篇文章,则是自己闲下来的时候,进行的一点小思考. 一.什么地方会用到树形结构 刚开始一看到这种结构的时候,最先是想到了家谱.家谱就 ...

  5. 构建树形结构数据(全部构建,查找构建)C#版

    摘要: 最近在做任务管理,任务可以无限派生子任务且没有数量限制,前端采用Easyui的Treegrid树形展示控件. 一.遇到的问题 获取全部任务拼接树形速度过慢(数据量大约在900条左右)且查询速度 ...

  6. 树形结构数据存储方案的选择和java list转tree

    树形结构数据存储方案 Adjacency List:每一条记录存parent_idPath Enumerations:每一条记录存整个tree path经过的node枚举Nested Sets:每一条 ...

  7. Oracle树形结构数据-相关知识总结

    Oracle树形结构数据--基本知识 1.数据组成 2.基本查询 2.1.查询某节点及该节点下的所有子孙节点 SELECT   *      FROM QIANCODE.TREE_TABLE_BASI ...

  8. Oracle树形结构数据---常见处理情景

    Oracle树形结构数据---常见处理情景 1.查看表数据结构 SELECT *      FROM QIANCODE.TREE_HIS_TABLE T  ORDER BY T.NODE_LEVEL; ...

  9. 【java基础 5】树形结构数据加载的思考

    前面两篇文章,分别介绍了使用递归和非递归算法加载树形结构数据的方式,本篇文章,则是自己闲下来的时候,进行的一点小思考. 一.什么地方会用到树形结构 刚开始一看到这种结构的时候,最先是想到了家谱.家谱就 ...

  10. 如何快速开发树形列表和分页查询整合的WInform程序界面

    我在做Winform界面的时候,一般都是统一化处理,界面顶部放置一些字段条件供查询,下面就是分页查询列表,展示相关的数据.但有时候碰到一些表字段内容分类比较多,有一些特别重要,如果放在一个树形列表来进 ...

随机推荐

  1. 在Winform程序中增加隐藏的按键处理,用于处理一些特殊的界面显示或者系统初始化操作

    以前,我看到一个朋友在对一个系统做初始化的时候,通过一组魔幻般的按键,调出来一个隐藏的系统设置界面,这个界面在常规的菜单或者工具栏是看不到的,因为它是一个后台设置的关键界面,不公开,同时避免常规用户的 ...

  2. 历代iPad及Android平板的主要参数对比

    「程序员的备忘录系列」这笔记可是持续更新的哦     逻辑分辨率Point,也就是CSS像素,是进行网页适配的关键,以下是平时整理的一些备忘录数据,可以收藏. 以现在平板的销量,还没有手机的十分之一, ...

  3. MySQL预处理语句PREPARE、EXECUTE、DEALLOCATE使用大全

    说明 MySQL官方将PREPARE.EXECUTE.DEALLOCATE统称为PREPARE STATEMENT,我习惯称其为[预处理语句]. 其语法为: PREPARE stmt_name FRO ...

  4. ElementUI Dialog 结合Vue实现对话框body“二分”布局

    Dialog 结合Vue实现对话框body"二分"布局 需求描述 如下图, 把对话框body内容部分,分成上下两部分,其中上部分高度根据窗口大小动态调整,如果内容过多,则出现滚动条 ...

  5. [HTTP] HTTP 协议 Response Header 之 Content-Length、Transfer-Encoding与Content-Encoding

    0 引言 在近期项目一场景中,一 Web API (响应内容:7MB - 40MB.数据项:5W-20W条)的网络传输耗时较大,短则 5s,长则高达25s,前端渲染又需要耗时 9s-60s. 在这个场 ...

  6. AI/机器学习(计算机视觉/NLP)方向面试复习1

    1. 判断满二叉树 所有节点的度要么为0,要么为2,且所有的叶子节点都在最后一层. #include <iostream> using namespace std; class TreeN ...

  7. Meta公司的Llama3大语言模型

    Github地址: https://github.com/meta-llama/llama3 官方介绍: https://ai.meta.com/blog/meta-llama-3/ 官方项目主页: ...

  8. 遗传算法和神经网络融合算法:GA-BP算法流程图

    相关: https://d.wanfangdata.com.cn/periodical/sxgcxb202109004

  9. Python报错:WARNING conda.models.version:get_matcher(542): Using .* with relational operator is superfluous and deprecated and will be removed in a future version of conda.

    参考: https://blog.csdn.net/weixin_45685859/article/details/132916216 报错: [23:59:14](pytorch) devil@OM ...

  10. vue之插槽-slot

    1.背景 2.slot简单使用 <!DOCTYPE html> <html lang="en"> <head> <meta charset ...