/**
* 过滤树形结构数据,保留指定的字段
*
* @param data 树形结构数据
* @param keepFields 需要保留的字段数组
* @returns 过滤后的树形结构数据
*/
function filterTreeData(data, keepFields) {
function processNode(node) {
const newNode = {}
for (let key in node) {
if (keepFields.includes(key)) {
newNode[key] = node[key]
}
// 特别处理children字段
if (key === 'children' && Array.isArray(node[key])) {
newNode[key] = node[key].map(child => processNode(child))
}
}
return newNode
}
return data.map(node => processNode(node))
}
使用方式:
const keptFields = ['id', 'name', 'formTypeCode'] // 指定要保留的字段
const filteredData = filterTreeData( data, keptFields)
讲解:
这段代码是一个 TypeScript 函数,名为 filterTreeData,用于过滤树形结构的数据。具体来说,它遍历树形数据的每个节点,并根据提供的 keepFields 数组来决定哪些字段应该保留在新的树形结构中。同时,它还会递归地处理每个节点的 children 字段(如果存在且为数组)。
下面是该代码的详细解释:
- 函数参数:
- data: 这是树形结构的数组。每个元素都是一个对象,代表树的一个节点。
- keepFields: 这是一个字符串数组,包含你想要保留在结果树形结构中的字段名。
- 内部函数 processNode:
- 这个函数用于处理树形结构中的每一个节点。
- 它首先创建一个空对象 newNode,用于存储过滤后的节点数据。
- 然后,它遍历输入节点 node 的每一个字段。如果字段名在 keepFields 数组中,那么该字段及其值会被复制到 newNode 中。如果字段名是 'children' 并且其值为数组(即,当前节点有子节点),那么它会递归地调用 processNode 函数来处理每一个子节点,并将处理后的子节点数组赋值给 newNode 的 'children' 字段。
- 最后,processNode 函数返回处理后的节点对象 newNode。
- 主函数体:
- 使用 map 方法遍历 data 数组中的每一个节点。
- 对于每一个节点,调用 processNode 函数进行处理。
- 返回处理后的节点数组。
示例:
假设你有以下树形结构的数据和 keepFields 数组:
const data = [
{
id: 1,
name: 'Node 1',
value: 100,
children: [
{ id: 2, name: 'Node 1.1', value: 200 },
{ id: 3, name: 'Node 1.2', value: 300 },
],
},
{
id: 4,
name: 'Node 2',
value: 400,
},
];
const keepFields = ['id', 'name'];
你将得到以下结果:
[
{
id: 1,
name: 'Node 1',
children: [
{ id: 2, name: 'Node 1.1' },
{ id: 3, name: 'Node 1.2' },
],
},
{
id: 4,
name: 'Node 2',
},
]
注意,除了 id 和 name 字段外,其他字段(如 value)都被过滤掉了,同时子节点的结构也被递归地过滤了。
本文暂时没有评论,来添加一个吧(●'◡'●)