
在处理复杂数据时,我们经常会遇到需要将分散在不同对象中的相关信息聚合到一起的场景。例如,你可能有一个包含学生基本信息的对象,以及另一个包含学生保密数据的对象,它们通过一个共同的 key(如学生id)关联。目标是将这些信息合并成一个统一的学生记录,以便于管理和展示。
考虑以下原始数据结构:
[
{
"key": 111,
"studentInfo": [
{
"details": {
"calculated_fields": null,
"status": false
}
}
]
},
{
"key": 222,
"studentInfo": [
{
"details": {
"calculated_fields": null,
"status": false
}
}
]
},
{
"confidential": {
"data": {
"access_control": {
"private_data": null,
"users": []
}
},
"key": 111
}
},
{
"confidential": {
"data": {
"access_control": {
"private_data": null,
"users": []
}
},
"key": 222
}
}
]我们期望的输出是这样的,每个 key 对应的所有信息都被合并到一个对象中:
[
{
"key": 111,
"studentInfo": [
{
"details": {
"calculated_fields": null,
"status": false
}
}
],
"confidential": {
"data": {
"access_control": {
"private_data": null,
"users": []
}
},
"key": 111
}
},
{
"key": 222,
"studentInfo": [
{
"details": {
"calculated_fields": null,
"status": false
}
}
],
"confidential": {
"data": {
"access_control": {
"private_data": null,
"users": []
}
},
"key": 222
}
}
]JavaScript 提供了强大的数组和对象操作方法,其中 Array.prototype.reduce() 和 Object.assign() 在处理这类数据聚合任务时尤为高效和灵活。
结合这两个方法,我们可以遍历原始数据数组,根据对象的 key 识别并合并相关信息。
立即学习“Java免费学习笔记(深入)”;
本文档主要讲述的是基于VC与Matlab的混合编程实现图像的三维显示;介绍了VC++与Matlab混合编程的一般实现方法,并实现对二维影像图的三维效果显示。 MATLAB既是一种直观、高效的计算机语言,同时又是一个科学计算平台。它为数据分析和数据可视化、算法和应用程序开发提供了最核心的数学和高级图形工具。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
9
以下代码展示了如何使用 reduce 和 Object.assign 来实现上述数据合并:
const inputData = [
{
key: 111,
studentInfo: [
{
details: {
calculated_fields: null,
status: false,
},
},
],
},
{
key: 222,
studentInfo: [
{
details: {
calculated_fields: null,
status: false,
},
},
],
},
{
confidential: {
data: {
access_control: {
private_data: null,
users: [],
},
},
key: 111,
},
},
{
confidential: {
data: {
access_control: {
private_data: null,
users: [],
},
},
key: 222,
},
},
];
const mergedResult = []; // 声明一个空数组,作为 reduce 的累加器初始值
inputData.reduce((outputAccumulator, currentObject) => {
// 判断当前对象是否包含顶层的 'key' 属性
if (currentObject.key) {
// 如果有顶层 'key',我们将其视为该键的“主记录”或起始记录,
// 直接推入结果数组中。
outputAccumulator.push(currentObject);
} else {
// 如果没有顶层 'key',则认为其 'key' 嵌套在 'confidential' 属性中,
// 并且该对象是用于补充现有记录的“辅助记录”。
// 查找 outputAccumulator 中是否存在与当前对象的 confidential.key 匹配的记录。
const targetObject = outputAccumulator.find(
(o) => o.key === currentObject.confidential.key
);
// 如果找到了匹配的目标对象,则将当前对象的属性合并到目标对象中。
// Object.assign 会将 currentObject 的所有可枚举属性复制到 targetObject。
// 如果属性名冲突,currentObject 的值将覆盖 targetObject 的值。
if (targetObject) {
Object.assign(targetObject, currentObject);
}
}
// 返回累加器,供下一次迭代使用
return outputAccumulator;
}, mergedResult); // 将 mergedResult 作为 reduce 的初始累加器
console.log(JSON.stringify(mergedResult, null, 2));const map = new Map();
inputData.forEach(obj => {
const key = obj.key || obj.confidential?.key;
if (key) {
map.set(key, { ...(map.get(key) || {}), ...obj });
}
});
const optimizedMergedResult = Array.from(map.values());这种方式通常在处理大规模数据时表现更优。
通过巧妙地结合 Array.prototype.reduce() 和 Object.assign(),我们能够以一种声明式且高效的方式,将结构不一致但通过共同键关联的 JSON 对象数组进行合并。这种模式在数据预处理、API响应整合以及各种需要数据聚合的场景中都非常实用。理解其背后的原理和注意事项,有助于开发者构建更健壮、更高效的数据处理逻辑。
以上就是高效合并 JavaScript 对象数组:以键为基准的聚合方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号