You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按idInteraction属性值汇总qualification?代码问题求修正

如何按数组对象的idInteraction属性汇总qualification字段总和

问题描述

我想要根据数组中对象的idInteraction属性值,汇总对应qualification字段的总和。尝试通过abilityOrder迭代,但没法正确匹配idInteraction,当前代码如下:

var arrayQ = [ '{"idInteraction":"{9ae8653e-99ef-11e9-9e08-90c283d38b9a}","abilityOrder":1, "qualification":40}', '{"idInteraction":"{9ae8653e-99ef-11e9-9e08-90c283d38b9a}","abilityOrder":2, "qualification":60}', '{"idInteraction":"{8ae8653e-99ef-11e9-9e08-90c283d38b9a}","abilityOrder":1, "qualification":20}', '{"idInteraction":"{8ae8653e-99ef-11e9-9e08-90c283d38b9a}","abilityOrder":2, "qualification":30}' ];
var q = 0;
function findMinMax(arr) {
 let min = JSON.parse(arr[0]).abilityOrder, max = JSON.parse(arr[0]).abilityOrder;
 for (let i = 1, len = arr.length; i < len; i++) {
 let v = JSON.parse(arr[i]).abilityOrder;
 min = (v < min)? v : min;
 max = (v > max)? v : max;
 }
 return [min, max];
}
var maxAbility = findMinMax(arrayQ);
arrayQ.forEach(function(result, index) {
 result = JSON.parse(result);
 let i = 0;
 if (i <= maxAbility[1] && result.idInteraction) {
 q = q + result.qualification;
 console.log('id..' + result.idInteraction + 'q..' + q);
 q = 0;
 }
});

预期输出结果:

"idInteraction":"{9ae8653e-99ef-11e9-9e08-90c283d38b9a}" - q = 100
"idInteraction":"{8ae8653e-99ef-11e9-9e08-90c283d38b9a}" - q = 50

问题分析

你的代码逻辑存在几个关键问题:

  • forEach循环里每次累加后立刻把q重置为0,根本没法累加同一个idInteraction的数值
  • 基于abilityOrder的最大最小值判断完全没必要,我们的核心需求是按idInteraction分组,和abilityOrder没有关联
  • 循环内的let i=0;和i <= maxAbility[1]逻辑无效,因为i每次都是0,这个判断永远成立

解决方案

我们可以用一个对象来映射每个idInteraction对应的qualification总和,遍历数组时完成累加,这是最直接高效的方式:

基础实现版本

var arrayQ = [ '{"idInteraction":"{9ae8653e-99ef-11e9-9e08-90c283d38b9a}","abilityOrder":1, "qualification":40}', '{"idInteraction":"{9ae8653e-99ef-11e9-9e08-90c283d38b9a}","abilityOrder":2, "qualification":60}', '{"idInteraction":"{8ae8653e-99ef-11e9-9e08-90c283d38b9a}","abilityOrder":1, "qualification":20}', '{"idInteraction":"{8ae8653e-99ef-11e9-9e08-90c283d38b9a}","abilityOrder":2, "qualification":30}' ];

// 创建空对象存储每个id对应的总和
const qualificationSum = {};

arrayQ.forEach(item => {
  // 解析JSON字符串为JS对象
  const parsedItem = JSON.parse(item);
  const { idInteraction, qualification } = parsedItem;
  
  // 累加逻辑:存在则加,不存在则初始化
  if (qualificationSum[idInteraction]) {
    qualificationSum[idInteraction] += qualification;
  } else {
    qualificationSum[idInteraction] = qualification;
  }
});

// 输出预期格式的结果
for (const id in qualificationSum) {
  console.log(`"idInteraction":"${id}" - q = ${qualificationSum[id]}`);
}

简化版(使用Array.reduce)

如果想让代码更简洁,可以用数组的reduce方法一步完成分组累加:

var arrayQ = [ '{"idInteraction":"{9ae8653e-99ef-11e9-9e08-90c283d38b9a}","abilityOrder":1, "qualification":40}', '{"idInteraction":"{9ae8653e-99ef-11e9-9e08-90c283d38b9a}","abilityOrder":2, "qualification":60}', '{"idInteraction":"{8ae8653e-99ef-11e9-9e08-90c283d38b9a}","abilityOrder":1, "qualification":20}', '{"idInteraction":"{8ae8653e-99ef-11e9-9e08-90c283d38b9a}","abilityOrder":2, "qualification":30}' ];

const qualificationSum = arrayQ.reduce((acc, item) => {
  const { idInteraction, qualification } = JSON.parse(item);
  // 用短路运算符简化判断:如果acc[idInteraction]不存在就取0,再累加
  acc[idInteraction] = (acc[idInteraction] || 0) + qualification;
  return acc;
}, {});

// 遍历结果输出
Object.entries(qualificationSum).forEach(([id, sum]) => {
  console.log(`"idInteraction":"${id}" - q = ${sum}`);
});

运行上述任意版本代码,都会得到你预期的输出结果。


内容的提问来源于stack exchange,提问作者Álvaro Manuel Maraví

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:09:26