J*aScript中基于对象键值比较计算总和


javascript中基于对象键值比较计算总和

本文详细介绍了在J*aScript中,如何通过比较两个嵌套对象(`values` 和 `points`)的键来计算特定值的总和。我们将探讨多种实现策略,包括使用嵌套的 `reduce` 方法、构建查找表以及提取符合条件的键集,以高效且清晰地聚合数据。文章将提供具体的代码示例和详细解释,帮助开发者理解并应用这些技术处理类似的数据聚合需求。

在J*aScript开发中,我们经常会遇到需要从不同数据源聚合信息的场景。一个常见的需求是,根据一个对象中的特定条件,在另一个对象中查找对应的数值并进行求和。本教程将以一个具体的示例,展示如何有效地解决这类问题。

场景描述与初始数据

假设我们有两个J*aScript对象:values 和 points。 values 对象存储了问题及其对应答案的状态,例如 'Q1A1': 'Yes' 或 'Q3A2': 'No'。 points 对象则存储了每个具体答案键(如 Q1A1)对应的分数。

我们的目标是:遍历 values 对象,对于其中标记为 "Yes" 的答案键,在 points 对象中查找其对应的分数,并将这些分数累加起来。如果答案标记为 "No",则不计入总和。

以下是我们的示例数据:

const values = {
    Q1: {
        Q1A1: "Yes",
    },
    Q2: {
        Q2A1: "Yes",
    },
    Q3: {
        Q3A2: "No",
    },
};

const points = {
    Q1A1: 41,
    Q1A2: 0,
    Q2A1: 19,
    Q2A2: 0,
    Q3A1: 25,
    Q3A2: 5, // 注意:虽然有分数,但因 values 中 Q3A2 为 "No",所以不应计入
};

根据上述规则,我们期望的最终总和是 points.Q1A1 (41) + points.Q2A1 (19) = 60。

解决方案一:使用嵌套 reduce 进行直接计算

这种方法通过两次 reduce 操作直接遍历 values 对象并计算总和。外层 reduce 遍历 values 的顶层键(如 Q1, Q2),内层 reduce 则处理每个顶层键下的答案对象(如 { Q1A1: "Yes" })。

const values = {
    Q1: { Q1A1: "Yes" },
    Q2: { Q2A1: "Yes" },
    Q3: { Q3A2: "No" },
};

const points = {
    Q1A1: 41,
    Q1A2: 0,
    Q2A1: 19,
    Q2A2: 0,
    Q3A1: 25,
    Q3A2: 5,
};

const totalSum = Object.values(values) // 获取 values 对象中所有顶层属性的值(即 Q1, Q2, Q3 对应的对象)
  .reduce((accumulator, currentObject) => { // 外层 reduce 遍历这些对象
    // currentObject 示例:{ Q1A1: "Yes" }
    return accumulator + Object.entries(currentObject) // 获取当前对象的所有 [键, 值] 对
      .reduce((innerAccumulator, [answerKey, answerValue]) => { // 内层 reduce 处理每个答案键值对
        // answerKey 示例:Q1A1, answerValue 示例:Yes
        // 检查两个条件:
        // 1. answerValue 不等于 'No' (即为 'Yes' 或其他非 'No' 值)
        // 2. points 对象中存在对应的 answerKey 且其值为真(非0、null、undefined等)
        if (answerValue !== 'No' && points[answerKey]) {
          return innerAccumulator + points[answerKey];
        }
        return innerAccumulator;
      }, 0); // 内层 reduce 的初始值为 0
  }, 0); // 外层 reduce 的初始值为 0

console.log("方法一计算的总和:", totalSum); // 输出: 60

代码解析:

  • Object.values(values):将 values 对象的所有属性值(即 { Q1A1: "Yes" }, { Q2A1: "Yes" }, { Q3A2: "No" })组成一个数组。
  • 外层 reduce:遍历这个数组。accumulator 累积最终的总和。
  • Object.entries(currentObject):对于每个像 { Q1A1: "Yes" } 这样的对象,将其转换为 [['Q1A1', 'Yes']] 这样的数组。
  • 内层 reduce:遍历这些键值对。innerAccumulator 累积当前顶层问题(如 Q1)对应的分数。
  • 条件 answerValue !== 'No' && points[answerKey]:这是核心逻辑。它确保只有当 values 中的答案不是 "No" 并且 points 对象中存在该答案键且其值有效时,才将 points[answerKey] 加入到总和中。

解决方案二:创建查找表然后过滤并求和

这种方法首先从 values 对象中构建一个易于查询的查找表,其中只包含符合条件的答案键。然后,我们遍历 points 对象,根据查找表过滤出需要求和的项,最后进行累加。这种方法在逻辑上可能更清晰,尤其当 values 对象的结构更复杂时。

HIX Translate HIX Translate

由 ChatGPT 提供支持的智能AI翻译器

HIX Translate 114 查看详情 HIX Translate
const values = {
    Q1: { Q1A1: "Yes" },
    Q2: { Q2A1: "Yes" },
    Q3: { Q3A2: "No" },
};

const points = {
    Q1A1: 41,
    Q1A2: 0,
    Q2A1: 19,
    Q2A2: 0,
    Q3A1: 25,
    Q3A2: 5,
};

// 步骤1: 创建一个查找表,只包含 values 中答案为 "Yes" 的键
const lookupTable = Object.values(values).reduce((acc, currentObject) => {
  const [answerKey, answerValue] = Object.entries(currentObject)[0]; // 假设每个内部对象只有一个键值对
  if (answerValue === "Yes") {
    acc[answerKey] = true; // 将符合条件的键添加到查找表,值可以是任意真值
  }
  return acc;
}, {});

console.log("查找表:", lookupTable); // 输出: { Q1A1: true, Q2A1: true }

// 步骤2: 遍历 points 对象,根据查找表过滤并求和
const totalSumWithLookup = Object.entries(points) // 获取 points 对象的所有 [键, 值] 对
  .filter(([key, score]) => lookupTable[key] && score) // 过滤:键存在于查找表且分数为真(非0、null等)
  .reduce((accumulator, [, score]) => accumulator + score, 0); // 对过滤后的分数进行求和

console.log("方法二计算的总和:", totalSumWithLookup); // 输出: 60

代码解析:

  • 创建查找表:
    • Object.values(values).reduce(...):与方法一类似,遍历 values 的顶层属性值。
    • [answerKey, answerValue] = Object.entries(currentObject)[0]:提取内部对象的键和值。
    • if (answerValue === "Yes") { acc[answerKey] = true; }:如果答案为 "Yes",则将该 answerKey 作为属性添加到 lookupTable 中,值为 true,表示该键是有效的。
  • 过滤并求和:
    • Object.entries(points):将 points 对象转换为 [[key, value], ...] 形式的数组。
    • .filter(([key, score]) => lookupTable[key] && score):筛选出那些键存在于 lookupTable 中(即 values 中对应的答案是 "Yes")且分数 score 本身是有效数值(非0、null、undefined)的条目。
    • .reduce((accumulator, [, score]) => accumulator + score, 0):对过滤后的条目中的分数进行累加。

解决方案三:提取键集合然后过滤并求和

此方法类似于方案二,但更侧重于仅提取 values 中符合条件的键到一个集合(Set)中,然后用这个集合来过滤 points。这种方法在处理大量键时,Set 的查找效率会比普通对象更高。

const values = {
    Q1: { Q1A1: "Yes" },
    Q2: { Q2A1: "Yes" },
    Q3: { Q3A2: "No" },
};

const points = {
    Q1A1: 41,
    Q1A2: 0,
    Q2A1: 19,
    Q2A2: 0,
    Q3A1: 25,
    Q3A2: 5,
};

// 步骤1: 从 values 中提取所有答案为 "Yes" 的键到一个 Set 中
const validAnswerKeys = Object.values(values).reduce((acc, currentObject) => {
  const [answerKey, answerValue] = Object.entries(currentObject)[0];
  if (answerValue === "Yes") {
    acc.add(answerKey); // 将符合条件的键添加到 Set
  }
  return acc;
}, new Set()); // 初始值为一个新的 Set

console.log("有效答案键集合:", validAnswerKeys); // 输出: Set(2) { 'Q1A1', 'Q2A1' }

// 步骤2: 遍历 points 对象,根据 Set 过滤并求和
const totalSumWithSet = Object.entries(points)
  .filter(([key, score]) => validAnswerKeys.has(key) && score) // 过滤:键存在于 Set 中且分数为真
  .reduce((accumulator, [, score]) => accumulator + score, 0);

console.log("方法三计算的总和:", totalSumWithSet); // 输出: 60

代码解析:

  • 提取有效键集合:
    • Object.values(values).reduce(..., new Set()):遍历 values 并使用 Set 作为累加器。
    • if (answerValue === "Yes") { acc.add(answerKey); }:如果答案为 "Yes",则将键添加到 Set 中。Set 自动处理重复键,确保每个键只出现一次。
  • 过滤并求和:
    • .filter(([key, score]) => validAnswerKeys.has(key) && score):使用 Set.prototype.has() 方法高效地检查 points 的键是否存在于 validAnswerKeys 集合中,同时检查分数是否有效。
    • .reduce((accumulator, [, score]) => accumulator + score, 0):对过滤后的分数进行累加。

总结与注意事项

以上提供了三种在J*aScript中根据条件比较两个对象并计算总和的方法。

  • 嵌套 reduce (方法一): 适用于逻辑紧密、一次性处理的场景。代码可能略显紧凑,但理解起来需要一定的 reduce 使用经验。
  • 创建查找表 (方法二): 逻辑清晰,将数据预处理和求和分为两个明确的步骤。当 values 对象较大或需要多次根据 values 的条件查询 points 时,预先构建查找表可以提高效率和可读性。
  • 提取键集合 (方法三): 与方法二类似,但使用 Set 来存储有效键。在键的数量非常大时,Set 的 has() 方法通常比普通对象的属性查找(lookupTable[key])具有更好的性能特性(平均O(1))。

注意事项:

  • 数据结构假设: 本教程中的 values 对象假设每个顶层属性(如 Q1)下只有一个嵌套的键值对(如 { Q1A1: "Yes" })。如果实际数据结构更复杂,例如 { Q1: { Q1A1: "Yes", Q1A2: "No" } },则需要调整内部 Object.entries(currentObject)[0] 的逻辑,可能需要遍历 currentObject 中的所有键值对。
  • 键不存在的处理: 在所有解决方案中,我们都通过 points[key] 或 score 的布尔值检查来确保 points 对象中存在相应的键且其值有效。如果 points[key] 为 undefined 或 0,它将不会被错误地添加到总和中(除非 0 是一个有效的分数并需要被累加,此时条件需要调整)。
  • 性能考量: 对于小型数据集,这三种方法的性能差异可以忽略不计。对于大型数据集,预处理(方法二和方法三)通常会比每次都进行复杂遍历(方法一)更有效率。Set 在键查找方面通常优于普通对象。

选择哪种方法取决于你的具体需求、数据规模以及你对代码可读性和性能的偏好。理解这些不同的技术将帮助你更灵活地处理J*aScript中的数据聚合任务。

以上就是J*aScript中基于对象键值比较计算总和的详细内容,更多请关注其它相关文章!


# java  # 键值对  # javascript开发  # 代码可读性  # javascript  # 茶产业 营销推广  # 固安企业网站优化  # seo教程论坛  # 哪个网站推广软文好发点  # 阿勒泰网站推广哪家好  # 小白想学seo  # 个人网站建设翻译成英文  # 内贸seo是什么意思  # 微信seo优化排名  # 建设网站信誉保证  # 随机数  # 有什么  # 有哪些  # 值为  # 符合条件  # 数据结构  # 如何实现  # 象中  # 键值  # 遍历  # red 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 如何查询个人病历记录  西瓜视频怎么查看访客记录_西瓜视频访客记录查看方法  iphone16系列配置参数介绍  抖音号升级企业号怎么改名字?升级企业号有哪些好处?  《绿竹漫游》关闭消息通知方法  如何在 WordPress 前端实现内容提交:古腾堡编辑器的替代方案与实践  手机远程连接电脑方法  Chart.js 教程:自定义插件实现图表与图例间距调整  虫虫漫画绿色安全入口_虫虫漫画绿色安全入口安全看漫画  背部总是隐隐作痛怎么回事 背痛如何改善  《豆瓣》私信用户方法  Dash应用中自定义HTML页面标题与网站图标(F*icon)的实用指南  如何在CSS中实现盒模型多列间距_grid-gap与padding结合  PHP中动态类名访问的类实例类型提示与静态分析实践  视频转蓝光m2ts格式  喜茶GO更换登录账号方法  AO3官方镜像链接 | 最新防走失网址永久收藏  如何在CSS中使用伪类选择器_hover实现悬停效果  edge浏览器怎么修改语言为中文_Edge界面语言切换教程  《战地6》反作弊已成功拦截240万次作弊 发售第一周98%比赛没有作弊  Python中处理嵌套字典与列表的数据提取与过滤教程  windows10怎么开启wsl_windows10安装linux子系统教程  mysql离线安装后如何启动_mysql离线安装完成后启动服务的方法  Go Goroutine调度与并发执行深度解析  三星M34录音变声问题_Samsung M34麦克风调整  mysql数据库索引类型有哪些_mysql索引类型解析  告别繁琐SEO!如何使用SyliusSitemap插件自动化生成网站地图,提升搜索引擎排名  Highcharts雷达图径向轴数值标签实现教程  以下哪一个是适应长期护理制度发展而设立的新职业  Golang如何初始化module项目_Golang module init使用说明  三角洲行动2025年9月10日摩斯密码分享  实现可重用自定义Python Range类  vivo云服务一直提示空间不足怎么办 怎么办vivo云服务老是提示空间不足  《领英》查看屏蔽名单方法  《雷电模拟器》自动点击设置方法  C++如何实现矩阵乘法_C++二维数组矩阵运算代码示例  如何修改Windows截图的默认保存位置_告别C盘让桌面更整洁【教程】  易车网官网直达入口 易车网在线登录入口  解决CSS容器溢出问题:使用calc()实现精确布局与边距控制  QQ邮箱PC端登录页面_QQ邮箱网页版登录界面  荣耀magicv5怎么上手测评  优化响应式标题底部边框:CSS实现技巧与最佳实践  Vue 3中独立响应式实例的创建与应用  Dash应用多值文本输入处理与类型转换教程  win11怎么设置默认终端为Windows Terminal Win11替代CMD和PowerShell【技巧】  Final Cut Pro视频加EQ教程  厨房地面防滑垫的油污怎么洗? 机洗和手洗防滑垫的注意事项  PyEZ 配置提交中 RpcTimeoutError 的健壮性处理策略  Windows Audio服务启动失败怎么办_电脑没声音的终极服务修复法【修复】  word邮件合并怎么插入个性化图片_Word邮件合并插入个性化图片方法 

 2025-12-08

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.