tabulator - 如何在 Tabulator 中过滤树结构中的子项?
问题描述
我尝试setFilter
在我的 Tabulator 树结构上调用函数,以过滤掉项目。它似乎只过滤掉顶级父母。知道如何使这项工作适用于任何级别(任何孩子或父母)吗?http://tabulator.info/docs/4.1/tree对过滤的工作原理没有多说。
功能
table.setFilter('id', '=', 214659)
没有返回任何东西......
树形结构
[
{
"level":0,
"name":"word1",
"id":125582,
"_children":[
{
"level":1,
"name":"word6",
"id":214659
},
{
"level":1,
"name":"word7",
"id":214633
},
{
"level":1,
"name":"word2",
"id":214263,
"_children":[
{
"level":2,
"name":"word8",
"id":131673
},
{
"level":2,
"name":"word9",
"id":125579
},
{
"level":2,
"name":"word10",
"id":125578
},
{
"level":2,
"name":"word4",
"id":172670,
"_children":[
{
"level":3,
"name":"word13",
"id":172669
},
{
"level":3,
"name":"word14",
"id":174777
},
{
"level":3,
"name":"word5",
"id":207661,
"_children":[
{
"level":4,
"name":"word15",
"id":216529
},
{
"level":4,
"name":"word16",
"id":223884,
"_children":[
{
"level":5,
"name":"word17",
"id":223885,
"_children":[
{
"level":6,
"name":"word18",
"id":229186,
"_children":[
{
"level":7,
"name":"word19",
"id":219062
},
{
"level":7,
"name":"word20",
"id":222243
}
]
}
]
}
]
}
]
}
]
},
{
"level":2,
"name":"word3",
"id":214266,
"_children":[
{
"level":3,
"name":"word11",
"id":216675
},
{
"level":3,
"name":"word12",
"id":216671
}
]
}
]
}
]
}
]
解决方案
经过一番搜索,发现了一个名为lodash
library的扩展,deepdash
它具有深度过滤,并且效果很好。
您将有 2 个新的依赖项,但我认为它会满足您的目的。在此处查看有关如何安装它们的文档
在此处的代码段中,您可以在日志中看到结果。我也在这里做了一个沙箱
这是一个 id 列表,一个或多个。
如果您只需要一个值,请更改条件。你的变量return _.indexOf(idList, value.id) !== -1;
在return id===value.id;
哪里id
id
同样在查看 Tabulator 的文档之后,只有一级过滤,即使您编写自己的自定义过滤器也无济于事,因为它需要一个布尔值来呈现该行或不呈现该行。但是只针对第一级,所以如果父级不是你寻找的子级会被忽略。您唯一的选择是过滤制表符之外的数据。
const data = [
{
level: 0,
name: "word1",
id: 125582,
_children: [
{
level: 1,
name: "word6",
id: 214659
},
{
level: 1,
name: "word7",
id: 214633
},
{
level: 1,
name: "word2",
id: 214263,
_children: [
{
level: 2,
name: "word8",
id: 131673
},
{
level: 2,
name: "word9",
id: 125579
},
{
level: 2,
name: "word10",
id: 125578
},
{
level: 2,
name: "word4",
id: 172670,
_children: [
{
level: 3,
name: "word13",
id: 172669
},
{
level: 3,
name: "word14",
id: 174777
},
{
level: 3,
name: "word5",
id: 207661,
_children: [
{
level: 4,
name: "word15",
id: 216529
},
{
level: 4,
name: "word16",
id: 223884,
_children: [
{
level: 5,
name: "word17",
id: 223885,
_children: [
{
level: 6,
name: "word18",
id: 229186,
_children: [
{
level: 7,
name: "word19",
id: 219062
},
{
level: 7,
name: "word20",
id: 222243
}
]
}
]
}
]
}
]
}
]
},
{
level: 2,
name: "word3",
id: 214266,
_children: [
{
level: 3,
name: "word11",
id: 216675
},
{
level: 3,
name: "word12",
id: 216671
}
]
}
]
}
]
}
];
const idList = [214659];
const found = _.filterDeep(
data,
function(value) {
return _.indexOf(idList, value.id) !== -1;
},
{ tree: true, childrenPath: '_children' }
);
console.log(found);
<script src="https://cdn.jsdelivr.net/npm/lodash/lodash.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/deepdash/browser/deepdash.min.js"></script>
<script>
deepdash(_);
</script>
推荐阅读
- java - 如何调用两个并行返回 DeferredResult<> 的方法?
- neo4j - Neo4j中链表的字段数组
- mysql - MySQL 删除子查询成本数百秒,而选择查询成本低得多
- html - 如何防止 TinyMCE 清理“&”
- python - Django:使用默认过滤器扩展 QuerySet
- python-3.x - ModuleNotFoundError:尽管模型似乎已安装,但没有名为“matplotlib”的模块
- google-cloud-platform - Airflow 的 DataprocPySparkOperator 一小时后超时(使用 Google Cloud Composer)
- excel - 使用 MID 和 FIND 将字符串中的数据提取到 Excel 单元格中
- ssis - 在 Foreach 循环中将数据插入到 Dynamics crm
- php - 如何通过 Script\Event 获取作曲家自动加载类映射?