JavaScript校验数字内各数位频率是否一致:已用reduce得频率但无法比较值
现有代码的几个具体问题
- 用
var声明的循环遍历变量存在变量提升,循环跑完之后i只会保留对象最后一个键的取值,根本不是遍历过程中逐次比对的逻辑 - 代码里写的
obj[i+1]是给字符串类型的对象键后面拼了数字1,比如键是'2'的话拼接后是'21',根本取不到相邻属性的实际频率值,拿不到正确的比对数据 - 没有设置统一的比对基准,判断逻辑从一开始就错位了
正确实现路径
你已经靠reduce完成了各数位的频率统计,剩下的校验不需要写复杂的嵌套循环:
- 输入的整数先转成字符串拆成数位数组,喂给你已经写好的
countOccurrences函数拿到频率映射对象 - 调用
Object.values()直接从对象里把所有频率值抽出来,组成一个纯数字数组 - 判断这个数组里的所有元素是不是完全相等——只要全部相等,就说明所有数位的出现频率完全一致
修正后的完整可运行代码
// 保留你已经实现的频率统计逻辑 const countOccurrences = arr => arr.reduce((accm, x) => (accm[x] = ++accm[x] || 1, accm), {}); const isDigitFreqSame = (inputNum) => { // 把输入数字拆成单个数位 const digits = String(inputNum).split(''); // 统计每个数位的出现频率 const freqMap = countOccurrences(digits); // 取出所有频率值组成数组 const freqValues = Object.values(freqMap); // 逐值比对:所有频率值和第一个基准值完全相等就返回true return freqValues.every(val => val === freqValues[0]); } // 测试验证 console.log(isDigitFreqSame(1212)); // 输出 true,匹配示例要求 console.log(isDigitFreqSame(234234)); // 输出 true console.log(isDigitFreqSame(11223)); // 输出 false
相比你原来手写循环的方式,用数组原生方法做比对的好处是:不会受
var变量提升的影响,也不需要手动拼接字符串形式的对象键去取值,逻辑清晰不容易出边界错误。
内容的提问来源于stack exchange,提问作者Ankit Gupta
相关产品推荐
相关产品推荐

