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

如何解析嵌套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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 13:15:03