如何对键名无预设的嵌套JSON递归移除值匹配时间戳模式的键
多层嵌套JSON全递归过滤 匹配时间戳值删除对应键值对实现
核心实现逻辑
实现这类需求不需要提前枚举所有可能的键名,完全可以通过递归遍历+值格式匹配的方式完成,核心规则如下:
- 覆盖所有JSON结构类型:不管是嵌套对象、数组元素,都逐节点向下递归遍历,不会遗漏深层字段
- 校验逻辑完全基于值的格式特征,和键名无关:只要字段值匹配预先定义的时间戳格式,就直接删除该键值对
- 匹配规则覆盖本次需要清理的两类时间戳格式:
- 带GMT后缀的RFC1123格式(例:
Fri, 19 Mar 2021 16:38:12 GMT) - 带Z后缀的ISO8601 UTC格式(例:
2021-03-19T16:40:59Z)
- 带GMT后缀的RFC1123格式(例:
通用可运行实现(JavaScript环境)
以下代码可直接在Node.js、浏览器控制台执行,支持任意深度的嵌套结构,无需根据键名做硬编码适配:
// 预定义需要匹配的时间戳格式正则 const TIMESTAMP_REGEX = [ /^[A-Za-z]{3}, \d{2} [A-Za-z]{3} \d{4} \d{2}:\d{2}:\d{2} GMT$/, /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$/ ] /** * 递归过滤值为时间戳格式的键值对 * @param {any} input 待处理的JSON节点 * @returns {any} 过滤后的结构 */ function removeTimestampFields(input) { // 处理数组结构:逐元素递归处理 if (Array.isArray(input)) { return input.map(item => removeTimestampFields(item)) } // 处理普通对象结构:逐键值对校验 if (typeof input === 'object' && input !== null) { const filteredResult = {} for (const [key, value] of Object.entries(input)) { // 先递归处理内层嵌套的值 const processedValue = removeTimestampFields(value) // 校验当前值是否为需要删除的时间戳格式 const isTimestampValue = typeof processedValue === 'string' && TIMESTAMP_REGEX.some(reg => reg.test(processedValue)) // 不匹配时间戳的字段才保留 if (!isTimestampValue) { filteredResult[key] = processedValue } } return filteredResult } // 基础类型直接返回 return input }
运行效果说明
将您提供的原始JSON结构传入removeTimestampFields函数后,输出结果和预期完全一致:
- 完整保留
tags: null、customerId、provisioningState、maxCapacityReservationLevel、count、name、type等所有非时间戳字段 - 自动删除
lastSkuUpdate、createdDate、modifiedDate、firstTimestamp、lastTimestamp所有匹配时间戳格式的键值对 - 适配性强:如果后续需要匹配其他时间戳格式,只需要在
TIMESTAMP_REGEX数组中补充对应正则即可,不需要改动递归遍历的核心逻辑
注:您给出的目标示例结构中,
maxCapacityReservationLevel行末尾的多余逗号属于JSON语法冗余,实际代码输出为标准合法的JSON结构。
内容的提问来源于stack exchange,提问作者Uday Pandya
相关产品推荐
相关产品推荐

