如何用单个reduce简化数组转方向次数统计对象的代码?
简化方案:单次reduce实现计数
首先你的原代码存在逻辑错误:比如统计'n'的数量时,return acc++会导致累加器额外自增,最终统计结果会偏离实际数量(比如5个'n'会算出9)。另外两次filter+reduce的组合会多次遍历数组,效率不高,用一次reduce就能搞定:
const walk = ['n','s','n','s','n','s','n','s','n','s']; const directionCounts = walk.reduce((counts, dir) => { // 把方向缩写映射为目标键名 const key = dir === 'n' ? 'north' : 'south'; // 累加计数,若键不存在则初始化为0再加1 counts[key] = (counts[key] || 0) + 1; return counts; }, {}); // 初始化空对象作为累加器
代码说明:
- 只遍历数组一次,比原方案的多次遍历更高效
- 累加器
counts是最终的统计对象,初始化为空对象(也可以提前初始化{ north: 0, south: 0 },效果一致) - 对每个元素,先把缩写
n/s映射为north/south,然后对应键的计数加1:(counts[key] || 0)处理键未定义的情况(空对象初始化时第一次遇到该键会是undefined,undefined || 0取0) - 每次迭代返回更新后的累加器,供下一次循环使用
如果希望跳过初始值判断,也可以直接初始化计数的默认值,代码会更简洁:
const directionCounts = walk.reduce((counts, dir) => { counts[dir === 'n' ? 'north' : 'south'] += 1; return counts; }, { north: 0, south: 0 });
内容的提问来源于stack exchange,提问作者jeweler23 jeweler23
相关产品推荐
相关产品推荐

