You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

countBy函数实现时赋值numOdd和numEv结果不同的原因是什么?

逗号运算符的执行逻辑

你写的newObj[callbackRes] = numEv, numOdd只会取第一个变量赋值,是因为JS中逗号运算符优先级低于赋值运算符,这行代码实际等价于:

// 仅将numEv赋值给对象属性,逗号后的numOdd不会参与赋值操作
(newObj[callbackRes] = numEv), numOdd;

所以不管逗号后写多少内容,赋值操作只会取等号右侧第一个逗号前的值。你用这个写法时,所有回调返回的键最终都会被赋值为遍历结束后numEv的值2,自然得到{ odd: 2, even: 2 }的错误结果。

现有代码的逻辑缺陷

你当前的写法存在两个核心问题:

  • 你硬编码了odd、even两个独立计数变量,而countBy是通用函数,回调可以返回任意值作为键,你的写法无法适配其他场景
  • 循环末尾你不管当前回调返回的是odd还是even,都统一将对应键的值设为numOdd,相当于把偶数的计数强行覆盖为当前的奇数计数,只是刚好你测试的场景下even最后被赋值时numOdd是2,和正确的偶数计数巧合一致,换其他测试用例就会完全错误。

正确实现方案

不需要单独定义每个键的计数变量,直接根据回调返回的键动态累加即可:

function countBy(array, callback){
  const newObj = {}
  for(let i = 0; i < array.length; i++){
    const key = callback(array[i])
    // 键不存在时先初始化为0,再累加计数
    newObj[key] = (newObj[key] || 0) + 1
  }
  return newObj
}

该写法兼容所有回调返回值的计数场景。

内容的提问来源于stack exchange,提问作者peiwei333

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 18:51:02