Node.js中Map遍历无输出原因分析及正确实现方案
问题分析与解决
问题原因
你创建了Map对象,但错误地使用普通对象属性赋值的方式(my_task[priority] = ...)添加数据,而非Map原生的set()方法。这种操作只是给Map实例挂载了额外的对象属性,并没有将数据存入Map的内部键值对存储结构中。因此Map的forEach()和for...of遍历只会读取它内部存储的键值对(此时为空,显示Map(0)),自然没有遍历内容输出。
正确实现方法
修改add函数,使用Map的原生方法has()、get()和set()来操作数据:
var my_task = new Map(); const add = (priority, task_name) =>{ if(!my_task.has(priority)){ // 用set方法初始化优先级对应的数组 my_task.set(priority, []); } // 用get方法获取对应优先级的数组,再添加任务 my_task.get(priority).push(task_name); } const init = () => { add(10, "Read"); add(11, "Clarify doubts"); add(7, "Play football"); }; const show = () => { console.log("Showing...\n", my_task); console.log("---"); my_task.forEach((val, key) => { console.log(`${key} -> ${val}`); }); console.log("---"); for(let [key, val] of my_task){ console.log(`${key} -> ${val}`); } console.log("Done"); }; init(); show();
运行输出
修改后运行代码,会得到正确的遍历结果:
Showing... Map(3) { 10 => [ 'Read' ], 11 => [ 'Clarify doubts' ], 7 => [ 'Play football' ] } --- 10 -> Read 11 -> Clarify doubts 7 -> Play football --- 10 -> Read 11 -> Clarify doubts 7 -> Play football Done
补充说明
Map核心操作方法:set(key, value)添加/更新键值对,get(key)获取对应值,has(key)检查键是否存在,delete(key)删除键值对。- 不要混淆
Map与普通对象的操作逻辑:普通对象用.或[]操作属性,Map必须用原生方法操作内部存储的键值对,才能被forEach、for...of等遍历方法识别。
内容的提问来源于stack exchange,提问作者devi_D
相关产品推荐
相关产品推荐

