You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 08:12:32