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
相关产品推荐
相关产品推荐

