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

JavaScript实现嵌套JSON对象扁平化并按日期倒序输出为数组

嵌套日期结构JSON扁平化+排序实现方案

灵活版扁平化实现

相比嵌套for循环,用flatMap的函数式写法代码更简洁,后续调整结构层级只要修改对应嵌套层数即可,灵活性更高:

const output = Object.entries(data).flatMap(([year, monthData]) => 
  Object.entries(monthData).flatMap(([month, dayData]) => 
    Object.entries(dayData).flatMap(([day, personList]) => 
      personList.map(person => ({ year, month, day, ...person }))
    )
  )
)

按日期降序排序实现

直接拼接日期字段为数字比较,无需转Date对象,性能更高:

output.sort((a, b) => {
  const dateA = Number(a.year + a.month + a.day)
  const dateB = Number(b.year + b.month + b.day)
  return dateB - dateA
})

不同实现的性能差异

  • 嵌套for循环:性能最高,无额外函数调用开销,适合十万条以上的超大数据量场景,缺点是代码冗余,层级固定后修改成本高
  • flatMap函数式写法:性能略低于嵌套for循环,万级以下数据量完全感知不到差异,代码易读易维护,灵活性更高,是绝大多数场景的最优选择
  • 递归实现:性能最低,仅适合完全不确定结构层级的场景,当前固定3层日期+1层人员列表的场景不需要使用

完整可运行示例

// 原始数据
const data = {
  '2021': {
    '08': {
      '26': [{'name': 'Bob', age: 34}, {'name': 'Alice', age: 33}],
      '27': [{'name': 'Jane', age: 21}]
    },
    '09': {
      '03': [{'name': 'John', age: 47}, {'name': 'Sue', age: 36}]
    }
  },
  '2022': {
    '04': {
      '05': [{'name': 'David', age: 26}]
    }
  }
}

// 扁平化
const output = Object.entries(data).flatMap(([year, monthData]) => 
  Object.entries(monthData).flatMap(([month, dayData]) => 
    Object.entries(dayData).flatMap(([day, personList]) => 
      personList.map(person => ({ year, month, day, ...person }))
    )
  )
)

// 排序
output.sort((a, b) => {
  const dateA = Number(a.year + a.month + a.day)
  const dateB = Number(b.year + b.month + b.day)
  return dateB - dateA
})

console.log(output)

运行后输出结果和需求的预期格式完全一致。

内容的提问来源于stack exchange,提问作者user1087973

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 10:24:02