JavaScript如何递归查找JSON中$date键并转换为Date对象
实现方案
判断对象是否存在指定键的方法
针对JSON解析生成的纯JS对象,判断指定键是否存在有三种常用方式:
hasOwnProperty方法:仅校验对象自身是否持有目标键,不会查找原型链,是JSON场景下最稳妥的判断方式,写法为obj.hasOwnProperty('目标键名')in运算符:会沿着原型链向上查找属性,写法为'目标键名' in obj,如果不需要排除原型链属性也可以使用- 直接取值判断:通过
obj['目标键名'] !== undefined判断,仅适合键值不会为undefined的场景,JSON标准格式本身不支持undefined值,因此多数场景下可用
$date字段递归转换实现
核心逻辑为深度优先遍历全量节点,遇到携带$date键的对象时直接替换为Date实例,其余节点递归处理即可,实现代码如下:
function convertDateNodes(input) { // 基础类型、null直接返回 if (typeof input !== 'object' || input === null) { return input; } // 数组场景:遍历每一项递归处理 if (Array.isArray(input)) { return input.map(item => convertDateNodes(item)); } // 命中$date结构,直接返回构造好的Date实例 if (input.hasOwnProperty('$date')) { return new Date(input.$date); } // 普通对象:遍历所有键,递归处理对应值 const result = {}; for (const key in input) { if (input.hasOwnProperty(key)) { result[key] = convertDateNodes(input[key]); } } return result; } // 测试验证 const beforeOne = { "id": "123", "aDate": { "$date": "2022-06-24T00:00:00Z" } } const afterOne = convertDateNodes(beforeOne); // 转换结果与预期完全一致 const beforeTwo = { "id": "123", "firstDate": { "$date": "2022-06-24T00:00:00Z" }, "day": { "today": { "$date": "2022-06-24T00:00:00Z" }, "tomorrow": { "$date": "2022-06-24T00:00:00Z" } } } const afterTwo = convertDateNodes(beforeTwo); // 任意嵌套层级的$date字段都会被全部正确转换
说明:以上实现不会修改原始输入对象,返回的是全新的转换结果,无副作用。如果需要直接在原对象上修改,遍历过程中直接给原对象键赋值即可,无需新建result对象存储结果。
内容的提问来源于stack exchange,提问作者lushan848
相关产品推荐
相关产品推荐

