如何解析嵌套JS对象中任意层级的所有date字段为d3时间格式
提问内容
我之前发布过该问题,但被人标记重复并推荐了相关参考回答,但该内容无法解决我的问题,原因如下:
- date键分布在多个不同命名的父键下
- 目标对象由数组与对象混合组成
- date键存在的层级不固定
因此我重新发布该问题。
我有如下JS对象:
const bb = { Harry: { details: [ { cat: "Life", values: [ { date: "2021-08-02", level: 77.6, }, { date: "2021-08-03", level: 79.1, }, ], }, ], }, Barry: { details: [ { cat: "Logic", values: [ { date: "2021-08-02", level: 77.6, }, { date: "2021-08-03", level: 79.1, }, ], }, ], }, };
我还定义了日期解析变量:const dateParse = d3.timeParse("%Y-%m-%d")
我需要解析该对象中所有的date字段值,但是date字段位于对象的深层级,且层级不固定,请问该如何实现?
预期输出如下:
const bb = { Harry: { details: [ { cat: "Life", values: [ { date: Mon Aug 02 2021 00:00:00 GMT+0530 (India Standard Time), level: 77.6, }, { date: Tue Aug 03 2021 00:00:00 GMT+0530 (India Standard Time), level: 79.1, }, ], }, ], }, Barry: { details: [ { cat: "Logic", values: [ { date: Mon Aug 02 2021 00:00:00 GMT+0530 (India Standard Time), level: 77.6, }, { date: Tue Aug 03 2021 00:00:00 GMT+0530 (India Standard Time), level: 79.1, }, ], }, ], }, };
回答
你可以通过递归遍历整个嵌套结构实现需求,不需要提前知道date字段的嵌套位置,不管是数组还是对象混合嵌套、层级多深,只要键名为date就会被自动转换。
完整实现代码
提供两种方案,你可以根据需求选择:
const dateParse = d3.timeParse("%Y-%m-%d") // 方案1:生成新的处理后对象,不会修改原bb对象 function parseAllDates(input) { // 处理数组:遍历每一项递归处理 if (Array.isArray(input)) { return input.map(item => parseAllDates(item)) } // 处理普通对象:遍历所有键值对 if (input && typeof input === 'object') { const result = {} for (const [key, value] of Object.entries(input)) { // 遇到date键直接转换值 if (key === 'date') { result[key] = dateParse(value) } // 其他键递归处理值 else { result[key] = parseAllDates(value) } } return result } // 字符串、数字等基础类型直接返回 return input } // 调用方法获取处理后的对象 const processedBb = parseAllDates(bb) // 方案2:直接修改原bb对象,不需要接收返回值 function parseAllDatesMutate(input) { if (Array.isArray(input)) { input.forEach(item => parseAllDatesMutate(item)) return } if (input && typeof input === 'object') { for (const [key, value] of Object.entries(input)) { if (key === 'date') { input[key] = dateParse(value) } else { parseAllDatesMutate(value) } } } } // 调用方法直接修改原对象 parseAllDatesMutate(bb)
效果说明
两种方案都会把所有嵌套层级里的date字段的字符串值转换为你预期的Date对象格式,完全适配你提到的三个限制场景。
内容的提问来源于stack exchange,提问作者moys
相关产品推荐
相关产品推荐

