
本教程详细阐述如何在J*aScript中,通过比较一个包含问题信息的对象数组与一个存储用户提交答案的对象,高效地提取并转换数据。我们将利用`reduce`创建查找表以优化状态名称的获取,并结合`Object.entries`和`map`来构建最终的简化结果数组,从而实现复杂数据结构的有效整合。
在现代Web应用开发中,我们经常需要处理和转换不同格式的数据。设想一个场景:你有一个包含问题详情的固定数据集,以及一个动态生成的用户提交答案数据集。目标是从这两个数据源中提取关键信息,并将其整合为一个更简洁、更易于消费的新数据结构。
首先,我们来审视原始数据结构和期望的输出格式。
原始数据 (问题详情数组 data): 这是一个对象数组,每个对象代表一个问题,包含id、state(问题状态/名称)和answers(可能的答案列表)。
const data = [{
id: "Q1",
state: "Test 1",
answers: [
{ id: "Q1A1", text: "Yes" },
{ id: "Q1A2", text: "No" },
],
}, {
id: "Q2",
state: "Test 2",
answers: [
{ id: "Q2A1", text: "Yes" },
{ id: "Q2A2", text: "No" },
],
}];提交值 (用户答案对象 submittedValue): 这是一个对象,其键是问题id,值是另一个对象,表示用户选择的具体答案。请注意,这个内部对象只有一个键值对,键是答案id,值是答案文本。
const submittedValue = {
Q1: {
Q1A1: "Yes",
},
Q2: {
Q2A2: "No",
},
};期望结果 (整合后的数组 result): 我们希望得到一个新数组,每个元素包含问题的state和用户选择的answer文本。
const result = [
{ state: "Test 1", answer: "Yes" },
{ state: "Test 2", answer: "No" },
];从上述结构可以看出,state信息来源于data数组,而answer信息来源于submittedValue对象。两个数据源通过问题id(data中的id和submittedValue的键)进行关联。
直接嵌套循环遍历data和submittedValue来匹配id虽然可行,但效率不高。一个更优化的策略是:
这一步的目标是从data数组中提取每个问题的id和state,并将其映射成一个易于查询的对象。我们可以使用Array.prototype.reduce()方法来实现这一点。
const testNameLookup = data.reduce((lookup, testItem) => {
const { id, state } = testItem;
lookup[id] = state;
return lookup;
}, {});
// testNameLookup 将会是:
// {
// Q1: 'Test 1',
// Q2: 'Test 2',
// }代码解析:
通过这个查找表,我们可以在O(1)的平均时间复杂度内,通过问题id获取到对应的state。
杰易OA办公自动化系统6.0
基于Intranet/Internet 的Web下的办公自动化系统,采用了当今最先进的PHP技术,是综合大量用户的需求,经过充分的用户论证的基础上开发出来的,独特的即时信息、短信、电子邮件系统、完善的工作流、数据库安全备份等功能使得信息在企业内部传递效率极大提高,信息传递过程中耗费降到最低。办公人员得以从繁杂的日常办公事务处理中解放出来,参与更多的富于思考性和创造性的工作。系统力求突出体系结构简明
0
查看详情
有了testNameLookup,我们现在可以遍历submittedValue对象,并结合查找表生成最终结果。由于submittedValue是一个对象而不是数组,我们需要使用Object.entries()方法将其转换为一个键值对数组,然后使用Array.prototype.map()进行转换。
const result = Object.entries(submittedValue).map(([key, value]) => {
// key 是问题 ID (如 "Q1")
// value 是提交的答案对象 (如 { Q1A1: "Yes" })
const state = testNameLookup[key]; // 从查找表获取 state
// 从提交的答案对象中提取答案文本。
// 假设每个提交的答案对象只有一个属性,所以取 Object.values(value)[0]
const answer = Object.values(value)[0];
return { state, answer };
});
// result 将会是:
// [
// { state: 'Test 1', answer: 'Yes' },
// { state: 'Test 2', answer: 'No' }
// ]代码解析:
。将上述两个步骤整合,我们可以得到一个完整且高效的解决方案:
const data = [{
id: 'Q1',
state: 'Test 1',
answers: [
{ id: 'Q1A1', text: 'Yes' },
{ id: 'Q1A2', text: 'No' },
],
}, {
id: 'Q2',
state: 'Test 2',
answers: [
{ id: 'Q2A1', text: 'Yes' },
{ id: 'Q2A2', text: 'No' },
],
}];
const submittedValue = {
Q1: { Q1A1: 'Yes' },
Q2: { Q2A2: 'No' },
};
// 步骤一:构建ID-状态查找表
const testNameLookup = data.reduce((lookup, testItem) => {
const { id, state } = testItem;
lookup[id] = state;
return lookup;
}, {});
// 步骤二:转换提交值以生成最终结果
const result = Object.entries(submittedValue).map(([key, value]) => {
const state = testNameLookup[key];
const answer = Object.values(value)[0]; // 假设提交的答案对象只有一个属性
return { state, answer };
});
console.log("生成的最终结果:", result);
// 预期输出:
// [
// { state: 'Test 1', answer: 'Yes' },
// { state: 'Test 2', answer: 'No' }
// ]
console.log("ID-状态查找表:", testNameLookup);
// 预期输出:
// { Q1: 'Test 1', Q2: 'Test 2' }数据完整性检查:
const state = testNameLookup[key] || '未知状态';
const answer = Object.values(value)[0] || '未作答';
Object.values(value)[0] 的假设:
const answer = value.text; // 假设答案对象是 { id: "Q1A1", text: "Yes" }可读性与维护性:
本教程展示了如何利用J*aScript的Array.prototype.reduce()、Object.entries()和Array.prototype.map()等高级数组和对象方法,高效地将分散在不同数据结构中的信息进行整合和转换。通过首先构建一个查找表,我们避免了重复的嵌套循环,显著提升了数据处理的效率和代码的清晰度。这种分步处理、利用中间数据结构(查找表)的策略,在处理复杂数据关联和转换场景时非常有效。
以上就是J*aScript中高效整合与转换复杂数据结构的详细内容,更多请关注其它相关文章!
相关文章:
J*a里如何实现线程安全的懒加载单例_懒加载单例实现方法解析
如何在离线环境中使用Composer_Composer离线安装依赖包的技巧与策略
解决Python单元测试中Mock异常方法调用计数为零的问题
解决Rails应用中内容错位与Turbo警告:meta标签误用导致富文本渲染异常
一加 14R 快充无反应_一加 14R 充电优化
Yandex搜索引擎官网入口_俄罗斯Yandex免登录一键直达
4399体育竞技小游戏_4399小游戏赛事入口
《燕云十六声》两周内达九百万玩家!位居畅销榜第五
怎样把文件彻底粉碎无法恢复_Windows下安全删除敏感数据【隐私保护】
AngularJS $http POST请求数据传递与Go后端接收实践
将PCM16音频数据转换为W*并编码为Base64教程
不同用户不同价格! 索尼开启账户个性化定价测试
C#使用XPath查询节点时出错? 常见语法错误与调试技巧
J*aScript中正确使用querySelectorAll与复杂CSS选择器
在J*a中如何在J*a中使用异常机制记录错误日志_异常日志实践经验
解决Django多数据库/多Schema环境下外键迁移问题
Golang如何使用new_Go new分配内存机制讲解
高德地图公交到站提醒失败如何解决 高德提醒权限设置
《刺客信条:影》PS5 Pro和Switch 2画面对比
网易大神怎么保存别人动态的图片_网易大神动态图片保存方法
QQ邮箱正确登录入口_QQ邮箱官方网站使用地址
TikTok国际版网页端快速入口 TikTok全球版短视频浏览教程
苹果手机指南针不准怎么校准 传感器校准方法详解【建议收藏】
Golang如何使用bytes.Split分割字节切片_Golang bytes切片分割方法
在J*a中如何使用Exception包装底层异常_异常包装与信息传递方法说明
动漫花园资源网使用步骤_动漫花园资源网下载流程
使用 Pandas 高效处理 .dat 文件:数据清洗与数值计算实战
基于动态规划的房屋花卉种植最小成本算法详解
qq游戏网页版直接玩_qq游戏免下载快速入口
天猫双十一预售商品怎么退款_天猫双十一预售退款操作指南
J*a初级项目如何接入API数据_第三方接口请求与响应解析
Win11 BitLocker密码忘了怎么办 Win11找回BitLocker恢复密钥方法【解决】
C++如何解决segmentation fault_C++段错误调试与原因分析
构建轻量级网站内部消息系统:Formspree 集成指南
mc.js免安装版 mc.js一键畅玩入口
蛙漫漫画官网在线入口 蛙漫全本漫画免费阅读平台
Tailwind CSS line-clamp 布局问题解析与修复指南
淘宝网网页版登录入口 淘宝官方网页版快捷登录
高德地图总提示网络异常怎么办 高德地图离线导航设置与网络排查方法
win11 arm版怎么安装 M1/M2 Mac虚拟机安装ARM win11的方法
妖精动漫免费平台 妖精动漫官网资源观看网址
铁路12306卧铺选择攻略 铁路12306下铺座位预定技巧
如何创建没有密码的Windows本地账户_跳过微软账户登录的技巧【教程】
小猿搜题在线学习页面在哪_小猿搜题在线学习中心入口
为什么我的微信朋友圈看不到别人的更新_微信朋友圈更新显示异常解决方法
c++ dfs和bfs代码 c++深度广度优先搜索算法
在J*a中如何开发简易电子商务商品管理系统_商品管理系统项目实战解析
Animex动漫社网入口地址 Animex动漫社网正版在线入口
智慧团建扫码登录入口 智慧团建扫码登录入口官网版
Composer的 "conflict" 字段有什么用_如何声明不兼容的包以避免依赖冲突