将嵌套的 JSON 对象展平并排序到 javascript 中的数组中
Posted
技术标签:
【中文标题】将嵌套的 JSON 对象展平并排序到 javascript 中的数组中【英文标题】:Flatten and sort a nested JSON object into an array in javascript 【发布时间】:2021-10-26 21:12:45 【问题描述】:我有一个类似的对象:
'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]
我想将此对象展平为按日期降序排列的<year, month, day, name, age>
对象数组,因此所需的输出为:
[
'year': '2022', 'month': '04', 'day': '05', 'name': 'David', age: 26,
'year': '2021', 'month': '09', 'day': '03', 'name': 'John', age: 47,
'year': '2021', 'month': '09', 'day': '03', 'name': 'Sue', age: 36,
'year': '2021', 'month': '08', 'day': '27', 'name': 'Jane', age: 21,
'year': '2021', 'month': '08', 'day': '26', 'name': 'Bob', age: 34,
'year': '2021', 'month': '08', 'day': '26', 'name': 'Alice', age: 33,
]
更新:
我按照Nina的逻辑,也拆分成2个部分,先扁平化成单深度数组,然后排序。扁平化部分我有一个“丑陋”的嵌套 for 循环,它也可以工作并使用完全相同的排序代码:
let output = []
for (const year in data)
for (const month in data[year])
for (const day in data[year][month])
for (const person of data[year][month][day])
const merged = Object.assign(
'year': year,
'month': month,
'day': day,
, person)
output.push(merged)
这不太灵活,我不确定如何判断性能差异,但我会接受 Nina 的有效答案。
【问题讨论】:
到目前为止你的想法是什么? 这看起来并不难。你有什么问题? 【参考方案1】:你可以把任务分成两部分,
-
通过递归从数据中获取平面数组,
按想要的键降序排序。
const
flat = (object, [key, ...keys], values = ) => Object
.entries(object)
.flatMap(([k, v]) =>
const right = ...values, [key]: k ;
return Array.isArray(v)
? v.map(o => ( ...right, ...o ))
: flat(v, keys, right);
),
keys = ['year', 'month', 'day'],
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 ] ,
result = flat(data, keys)
.sort((a, b) =>
let r;
keys.some(k => r = b[k] - a[k]);
return r;
);
console.log(result);
.as-console-wrapper max-height: 100% !important; top: 0;
【讨论】:
以上是关于将嵌套的 JSON 对象展平并排序到 javascript 中的数组中的主要内容,如果未能解决你的问题,请参考以下文章