如何按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í
相关产品推荐
相关产品推荐

