
原始数据结构分析
我们从一个包含教育信息和多个动态日期键值对的数组开始。每个对象代表一个教育实体(如“school”、“colleg”),其后跟着一系列以日期字符串(如“2021-12”)为键、对应数值为值的字段。这种结构虽然在某些场景下可能方便生成,但在需要按日期聚合或进行时间序列分析时,会带来挑战。
以下是原始数据的示例:
var arr = [{
"education": "school",
"2021-12": 65.45,
"2022-01": 172762.27,
"2022-02": "959.5"
}, {
"education": "colleg",
"2021-12": 270.13,
"2022-01": 105429534.09,
"2022-02": 53543770.9,
"2022-03": 100004545
}, {
"education": "university",
"2021-12": 168396.95,
"2022-01": 170417648.96999997,
"2022-02": 1202822.9
}];在此结构中,日期键是动态的,且每个教育实体可能不包含所有日期的数据。
目标数据结构
我们的目标是将数据重构为一个新的数组,其中每个对象代表一个特定的日期。在这个日期对象内部,原始数据的 education 字段值将作为新的键,其对应的日期值将作为该键的值。此外,每个对象还将包含一个明确的 date 字段来标识其所属的日期。
以下是期望的输出结构示例:
立即学习“Java免费学习笔记(深入)”;
[{
"school": "65.45",
"colleg": "270.13",
"university": "168396.95",
"date": "2021-12"
}, {
"school": "172762.",
"colleg": "105429534.09",
"university": "170417648.96999997",
"date": "2022-01"
}, {
"school": "959.5",
"colleg": "53543770.9",
"university": "1202822.9",
"date": "2022-02"
}, {
"colleg": "959.5",
"date": "2022-03",
}]这种结构使得按日期访问数据变得直观,并且便于对不同教育类型在特定日期的表现进行比较。
重构思路与实现
为了实现上述转换,我们需要执行以下几个关键步骤:
- 收集所有唯一的日期和教育类型: 遍历原始数组,提取所有不重复的日期键和 education 字段的值。这些将作为我们构建新数据结构的基础。
- 以日期为维度构建新对象: 遍历收集到的每个唯一日期。对于每个日期,我们将创建一个新的空对象,用于存储该日期下的所有教育数据。
- 填充教育数据: 对于当前日期,遍历所有收集到的唯一教育类型。查找原始数据中对应教育类型在该日期下的值。如果存在,则将其添加到当前日期对象中,以教育类型作为键,对应值作为值。
- 添加日期标识: 将当前日期作为 date 键添加到日期对象中。
- 聚合结果: 将所有构建好的日期对象收集到一个新的数组中。
下面是使用JavaScript实现的具体代码:
var arr = [{
"education": "school",
"2021-12": 65.45,
"2022-01": 172762.27,
"2022-02": "959.5"
}, {
"education": "colleg",
"2021-12": 270.13,
"2022-01": 105429534.09,
"2022-02": 53543770.9,
"2022-03": 100004545
}, {
"education": "university",
"2021-12": 168396.95,
"2022-01": 170417648.96999997,
"2022-02": 1202822.9
}];
// 使用 Set 收集唯一的日期和教育类型,以确保不重复
let uniqueDates = new Set();
let uniqueEducations = new Set();
arr.forEach(item => {
for (const key in item) {
if (item.hasOwnProperty(key)) { // 确保是










