ES6 Node.js中如何对Map对象所有值求和,现有代码报错如何修复?
问题修复方案
错误原因
Map构造函数的传参格式不符合规范:Map构造函数仅接收1个可迭代的键值对集合类型的参数,你当前传入了多个独立普通对象,且普通对象默认不属于可迭代类型,构造函数初始化时尝试读取迭代方法失败,直接抛出TypeError: undefined is not a function错误。- 标准的Map初始化入参为二维数组结构,每个子项为
[键名, 键值]的键值对。
修复方案
方案1:直接按规范初始化Map
如果你是手动写Map的初始值,直接改成二维数组传参即可,原求和逻辑不需要修改:
// 正确的Map初始化格式 let addInput = new Map([ ["key1", 10], ["key2", 5], ["key3", 7], ["key4", 17] ]); let sum = 0; addInput.forEach((v) => { sum += v; }); console.log(sum); // 输出结果为39
方案2:从多个普通对象生成Map
如果你的源数据本身就是多个独立的对象,可以先合并所有对象,再通过Object.entries()转为可迭代的键值对集合后传入Map构造函数:
// 源对象列表 const sourceObjs = [{"key1":10}, {"key2":5}, {"key3":7}, {"key4":17}]; // 合并为单个对象后转Map const mergedObj = Object.assign({}, ...sourceObjs); let addInput = new Map(Object.entries(mergedObj)); let sum = 0; addInput.forEach((v) => sum += v); console.log(sum); // 输出结果为39
可选优化
如果不需要保留遍历过程,可以直接提取Map的所有值转为数组后用reduce求和,代码更简洁:
const sum = Array.from(addInput.values()).reduce((prev, curr) => prev + curr, 0);
内容的提问来源于stack exchange,提问作者Carolyn Cordeiro
相关产品推荐
相关产品推荐

