JavaScript如何实现二维数组按相同字段分组累加对应数值
实现方案
核心思路是用对象做哈希表,按日期维度分组累计数值,最后把哈希表转回要求的二维数组格式即可。
基础易懂写法
const originArray = [["10/10/2020","1000"],["10/10/2020","300"],["07/10/2020","100"],["07/10/2020","100"],["03/10/2020","100"],["10/10/2020","100"]]; const sumCache = {}; originArray.forEach(item => { const currentDate = item[0]; // 原数组第二个元素是字符串,必须转数字再累加,否则会做字符串拼接 const currentVal = Number(item[1]); sumCache[currentDate] = sumCache[currentDate] ? sumCache[currentDate] + currentVal : currentVal; }); // 把缓存对象转成目标二维数组,累计值转回字符串和示例格式对齐 const arrayAdd = Object.entries(sumCache).map(([date, total]) => [date, String(total)]);
运行后输出的arrayAdd和预期结果完全一致:
[ ["10/10/2020", "1400"], ["07/10/2020", "200"], ["03/10/2020", "100"] ]
注:给出的预期结果里写的
"O7/10/2020"是笔误,实际应为数字0开头的"07/10/2020"。
精简写法
如果偏好更短的实现,可以用reduce一步完成分组累加:
const arrayAdd = Object.entries( originArray.reduce((cache, [date, valStr]) => { cache[date] = (cache[date] || 0) + Number(valStr); return cache; }, {}) ).map(([date, total]) => [date, String(total)]);
两种写法逻辑完全相同,所有支持ES5及以上标准的浏览器/Node环境都可以直接运行。
内容的提问来源于stack exchange,提问作者rarewareR
相关产品推荐
相关产品推荐

