JS for/if循环新增对象键改值:统计数组整数频次逻辑错误如何解决?
问题定位
- 遍历逻辑错误:
for...in遍历数组时,循环变量i对应的是数组的索引字符串,而非数组存储的元素值,这是核心错误,导致你最终统计的是索引的出现次数,而非整数元素的出现次数。 - 变量声明不规范:
integers2未使用var/let/const声明,会默认挂载为全局变量,存在作用域污染风险。 - 输入类型问题:
readlineSync.question返回的输入值为字符串类型,虽然作为对象键时会自动隐式转换不影响统计结果,如果需要键为数字类型可额外做类型转换。
修正方案
把数组遍历段的代码替换为获取元素的遍历逻辑即可,完整修正代码如下:
// 引入readline-sync模块 var readlineSync = require('readline-sync'); // 初始化变量 var integer; // 补全变量声明 var integers2 = {}; var integers = []; // 获取用户输入 integer = readlineSync.question('Integer?: ') // 校验输入,插入1-100的整数,输入0停止 while (integer != 0 && integer >= 1 && integer <= 100){ console.log("not 0!") // 可选:转数字类型后存入数组 integers.push(Number(integer)) integers.push(integer) integer = readlineSync.question('Integer?: ') } console.log(integers); // 改用for...of遍历直接获取数组元素 for(const num of integers){ if (num in integers2){ integers2[num] += 1 } else { integers2[num] = 1 } } console.log(integers2)
如果需要兼容不支持for...of的旧版本JS环境,也可以用普通for循环实现:
for(var i = 0; i < integers.length; i++){ var num = integers[i]; if (num in integers2){ integers2[num] += 1 } else { integers2[num] = 1 } }
内容的提问来源于stack exchange,提问作者Jahigs
相关产品推荐
相关产品推荐

