如何对二维数组去重并累加重复键对应的数值?
实现二维数组重复键合并并累加对应值
当然可以实现,以下是两种常用的JavaScript解决方案:
方法一:使用对象 + reduce
const arr = [[1664164800000,38],[1669006800000,11],[1669611600000,4],[1669611600000,12],[1670216400000,8]]; const result = Object.entries( arr.reduce((acc, [key, value]) => { // 若键已存在则累加值,否则初始化为当前值 acc[key] = (acc[key] || 0) + value; return acc; }, {}) ).map(([key, value]) => [Number(key), value]); // 将字符串键转回数字 console.log(result); // 输出:[[1664164800000,38],[1669006800000,11],[1669611600000,16],[1670216400000,8]]
逻辑说明:
- 用
reduce遍历原数组,构建一个以时间戳为键、累加值为值的对象 - 用
Object.entries将对象转换为键值对数组 - 通过
map把字符串类型的键转回数字类型,得到目标格式的二维数组
方法二:使用Map(更直观)
const arr = [[1664164800000,38],[1669006800000,11],[1669611600000,4],[1669611600000,12],[1670216400000,8]]; const sumMap = new Map(); arr.forEach(([key, value]) => { // 从Map中获取已有值(不存在则取0),累加后存回Map sumMap.set(key, (sumMap.get(key) || 0) + value); }); const result = Array.from(sumMap); // 直接将Map转为二维数组 console.log(result); // 输出:[[1664164800000,38],[1669006800000,11],[1669611600000,16],[1670216400000,8]]
逻辑说明:
- 创建
Map实例存储键值对,Map的键支持数字类型,无需后续类型转换 - 遍历原数组,更新Map中对应键的累加值
- 用
Array.from将Map直接转换为目标格式的二维数组,因为Map的默认迭代器会返回[key, value]形式的数组
内容的提问来源于stack exchange,提问作者Aditya Gaonkar
相关产品推荐
相关产品推荐

