编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

js 封装一个过滤树形结构数据保留指定的字段函数

wxchong 2024-08-24 01:39:46 开源技术 9 ℃ 0 评论
/**
 * 过滤树形结构数据,保留指定的字段
 *
 * @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 字段(如果存在且为数组)。

下面是该代码的详细解释:

  1. 函数参数:
  2. data: 这是树形结构的数组。每个元素都是一个对象,代表树的一个节点。
  3. keepFields: 这是一个字符串数组,包含你想要保留在结果树形结构中的字段名。
  4. 内部函数 processNode:
  5. 这个函数用于处理树形结构中的每一个节点。
  6. 它首先创建一个空对象 newNode,用于存储过滤后的节点数据。
  7. 然后,它遍历输入节点 node 的每一个字段。如果字段名在 keepFields 数组中,那么该字段及其值会被复制到 newNode 中。如果字段名是 'children' 并且其值为数组(即,当前节点有子节点),那么它会递归地调用 processNode 函数来处理每一个子节点,并将处理后的子节点数组赋值给 newNode 的 'children' 字段。
  8. 最后,processNode 函数返回处理后的节点对象 newNode。
  9. 主函数体:
  10. 使用 map 方法遍历 data 数组中的每一个节点。
  11. 对于每一个节点,调用 processNode 函数进行处理。
  12. 返回处理后的节点数组。

示例:

假设你有以下树形结构的数据和 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)都被过滤掉了,同时子节点的结构也被递归地过滤了。



Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表