JavaScript中数组索引获取异常及reduce方法使用问题求助
解答你的reduce方法与posArr输出问题
首先来说为什么console.log(posArr)输出的是[1,2,3]而非你预期的[0,1,2]——你的代码里有两个关键的逻辑错误:
- 第一,
map回调里的参数x是arr中的元素(比如'1'、'2'、'3'),你写的arr[x]会把字符串x隐式转成数字,所以arr['1']等价于arr[1],也就是取到数组的第二个元素'2',再用arr.indexOf(arr[x])找这个元素的索引,得到的是1,这和你想要的“当前元素的索引”完全不沾边。 - 第二,
Array.push()方法的返回值是数组的新长度,而不是你push进去的元素。所以第一次nOfPos.push(1)后,数组长度变成1,这个1就被存入了posArr;第二次push后长度是2,存入posArr;第三次的时候,arr['3']对应arr[3],但你的arr只有3个元素(索引0-2),所以arr[3]是undefined,不过看起来你的测试输出是3,可能是实际代码有笔误?不管怎样,这写法完全达不到你要存索引的目的。
如果你想把数组的所有索引存入nOfPos,同时让posArr等于[0,1,2],可以这样修改代码:
function combinations(x) { let arr = x.toString().split(''); console.log(arr); let nOfPos = []; // 用map的第二个参数(当前元素的索引)来实现 let posArr = arr.map((_, index) => { nOfPos.push(index); return index; // 返回索引,而不是push的返回值 }); // 给reduce加初始值1,避免数组含0时乘积直接为0 let mult = posArr.reduce((acum, item) => acum * item, 1); console.log(posArr); // 现在会输出[0,1,2] console.log(mult); // 输出0*1*2=0 } combinations(123);
再说说reduce方法的常见注意点:
- 如果不给
reduce传初始值,它会默认用数组的第一个元素作为初始的acum,然后从第二个元素开始迭代。比如你原来的posArr是[1,2,3],reduce会先拿1作为acum,乘以2得2,再乘以3得6;但如果数组是空的,不传初始值会报错。 - 如果你要计算乘积,建议始终传入初始值1,这样即使数组里有0,逻辑也符合预期;如果是求和,初始值传0会更稳妥。
内容的提问来源于stack exchange,提问作者Ramiro
相关产品推荐
相关产品推荐

