JavaScript用数组统计选项选中次数时二次运行数组重置问题
投票累计计数重置问题解决
问题根因
每次运行代码计数归零是必然结果,核心原因如下:
- 代码首行写死了
let arr = [0,0,0,0],每次启动都会重新初始化全0数组。代码单次运行结束后,当前上下文的内存数据会被系统回收,没有持久化存储的前提下,上一次运行的计数数据不可能留存。 - 原有逻辑存在三处冗余/缺陷:
prompt返回值为字符串类型,和数字索引做非严格相等比较虽然能跑通,但存在类型转换隐患;没有输入合法性校验,用户输入0-3范围外的内容时没有任何提示拦截;遍历全数组匹配索引的写法完全多余,直接用选项值作为数组下标访问即可。
修复方案
浏览器环境下用localStorage做计数持久化:代码启动时优先读取本地存储的历史计数,无历史数据时才初始化全0数组;用户投票更新计数后,立刻把最新计数同步写入本地存储,下次启动即可读取到累计值,同时补全输入校验逻辑。
修复后完整代码:
// 优先读取本地存储的历史计数,无历史数据才初始化全0数组 let arr = JSON.parse(localStorage.getItem('pollCount')) || [0, 0, 0, 0] const poll = { registerNewAnswer: function () { const input = prompt(` Which is your favourite Movie? 0: Toy Story 1: Star Wars 2: Fast & Furious 3: Final Destination (Write option number) `); // 校验输入合法性 const option = Number(input); if (isNaN(option) || option < 0 || option > 3) { alert('请输入0-3范围内的有效选项编号'); return null; } return option; } } const userChoice = poll.registerNewAnswer(); if (userChoice !== null) { arr[userChoice] += 1; // 最新计数同步写入本地存储 localStorage.setItem('pollCount', JSON.stringify(arr)); console.log('当前累计投票结果:'); console.log(...arr); }
如果是Node.js环境运行,把
localStorage读写逻辑替换为本地文件读写即可,核心逻辑一致:不要每次启动都硬编码重置计数数组,把计数数据存在代码运行上下文之外的持久化介质中。
内容的提问来源于stack exchange,提问作者Hitesh
相关产品推荐
相关产品推荐

