如何不改变对象结构对其嵌套的多类型日期字段做格式化
嵌套结构日期格式化实现方案
通用递归实现(适配任意嵌套层级)
该方案会自动遍历所有嵌套的对象、数组,识别Date实例、合法ISO日期字符串、null三种类型,保留原始结构的前提下完成日期格式化:
import moment from 'moment'; const formatDatesRecursively = (input) => { // 处理null值 直接返回 if (input === null) return null; // 处理Date实例 if (input instanceof Date) { return moment(input).format('YYYY-MM-DD'); } // 处理字符串类型,判断是否为合法ISO日期 if (typeof input === 'string') { const parsedDate = moment(input, moment.ISO_8601, true); return parsedDate.isValid() ? parsedDate.format('YYYY-MM-DD') : input; } // 处理数组类型,递归遍历每个元素 if (Array.isArray(input)) { return input.map(item => formatDatesRecursively(item)); } // 处理普通对象类型,递归遍历每个键值对 if (typeof input === 'object') { return Object.entries(input).reduce((acc, [key, value]) => { acc[key] = formatDatesRecursively(value); return acc; }, {}); } // 其他基础类型直接返回 return input; }
使用示例
// 原始数据 const values = { someObject: { array: [ { dateOne: '2021-10-21T22:00:00.000Z', dateTwo: '2021-10-21T22:00:00.000Z', } ] } }; // 调用函数处理 const result = { ...values, someObject: formatDatesRecursively(values.someObject) };
处理后的输出和期望结构完全一致:
{ someObject: { array: [ { dateOne: '2021-10-21', dateTwo: '2021-10-21', } ] } }
优化版本(适合字段命名规范的场景)
如果日期字段命名有统一规则(比如都包含date/time关键词),可以用字段名匹配替代全局日期校验,性能更高:
const formatDatesByField = (input) => { if (input === null) return null; if (input instanceof Date) return moment(input).format('YYYY-MM-DD'); if (Array.isArray(input)) return input.map(item => formatDatesByField(item)); if (typeof input === 'object') { return Object.entries(input).reduce((acc, [key, value]) => { acc[key] = key.toLowerCase().includes('date') ? moment(value).format('YYYY-MM-DD') : formatDatesByField(value); return acc; }, {}); } return input; }
内容的提问来源于stack exchange,提问作者PengProgrammer
相关产品推荐
相关产品推荐

