如何使用forEach统计二维数组中'cat'的出现次数?
解决二维数组中指定字符串的统计问题
先明确你当前代码的核心问题:
map方法会返回一个和原数组长度一致的新数组(原数组有4个元素,所以count是长度为4的数组),最后打印count.length自然得到4,这和统计'cat'的次数完全无关。forEach没有返回值,且count + 1只是做了加法运算,没有把结果赋值给count,根本没实现累加逻辑。
下面给出几种结合箭头函数的正确实现方式:
方法1:扁平化数组后统计
先把二维数组转成一维,再用reduce累加次数:
const arr = [ ['mammal','dog','fur'], ['mammal','cat','fur'], ['mammal','cat','fur'], ['fish','trout','scales'] ]; const count = arr.flat().reduce((total, str) => { return str === 'cat' ? total + 1 : total; }, 0); console.log(count); // 输出2
说明:
arr.flat()将二维数组转为一维数组,方便统一遍历reduce接收累加器函数和初始值0,每次遍历判断当前字符串是否为'cat',是则给累加器加1,否则保持原值
方法2:嵌套reduce(不扁平化数组)
如果不想改变数组结构,可以用两层reduce分别处理外层和内层数组:
const arr = [ ['mammal','dog','fur'], ['mammal','cat','fur'], ['mammal','cat','fur'], ['fish','trout','scales'] ]; const count = arr.reduce((outerTotal, innerArr) => { // 统计当前内层数组中'cat'的次数 const innerCount = innerArr.reduce((innerTotal, str) => { return str === 'cat' ? innerTotal + 1 : innerTotal; }, 0); // 把内层统计结果加到外层累加器 return outerTotal + innerCount; }, 0); console.log(count); // 输出2
方法3:修正你的forEach写法
如果坚持用forEach,需要先初始化累加变量,再在两层遍历中完成累加:
const arr = [ ['mammal','dog','fur'], ['mammal','cat','fur'], ['mammal','cat','fur'], ['fish','trout','scales'] ]; let count = 0; arr.forEach(innerArr => { innerArr.forEach(str => { if (str === 'cat') { count += 1; // 必须用赋值累加,而非仅做加法运算 } }); }); console.log(count); // 输出2
注意:这里要用let声明count(因为需要修改它的值),且必须写count += 1或count++,仅写count + 1不会改变count的实际值。
内容的提问来源于stack exchange,提问作者Southern-Remove
相关产品推荐
相关产品推荐

