You need to enable JavaScript to run this app. JavaScript校验数字内各数位频率是否一致:已用reduce得频率但无法比较值
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.31 02:06:09