JavaScript入门问题:数组与map方法实现相邻元素求和
解决数组元素与下一个元素相加的问题
嘿,很高兴看到你在练习JavaScript数组操作!你遇到的这个NaN问题其实是数组遍历里的常见小坑,咱们一步步来理清它,再找到更优的实现方式~
为什么会出现NaN?
你用map遍历数组时,map会处理数组的每一个元素。当遍历到最后一个元素(索引4)时,numbers[index + 1]就是numbers[5]——而你的数组只有5个元素(索引0到4),所以这个位置的值是undefined。数字和undefined相加就会得到NaN,这就是问题所在。
方案一:在map中添加判断(最直观)
我们可以在map的回调函数里,检查当前元素是不是最后一个。如果是,直接返回它本身;如果不是,就和下一个元素相加。这里还可以用到map的第三个参数arr(就是原数组本身),让代码更灵活:
var numbers = [1, 3, 5, 10, 11]; var result = numbers.map((x, index, arr) => { // 最后一个元素的索引是 arr.length - 1,所以 index 小于这个值时才有下一个元素 if (index < arr.length - 1) { return x + arr[index + 1]; } else { return x; // 最后一个元素直接返回自身 } }); console.log(result); // 输出:[4, 8, 15, 21, 11]
方案二:拆分处理(更清晰的分步逻辑)
如果你觉得判断逻辑有点绕,也可以把数组拆成两部分处理:
- 先处理前
n-1个元素(每个和下一个相加) - 再把最后一个元素拼接到结果里
用slice(0, -1)可以快速获取到数组除了最后一个元素之外的所有元素,然后用concat拼接最后一个元素:
var numbers = [1, 3, 5, 10, 11]; // 处理前4个元素,每个与下一个相加 var summedPart = numbers.slice(0, -1).map((x, index) => x + numbers[index + 1]); // 拼接最后一个元素 var result = summedPart.concat(numbers[numbers.length - 1]); console.log(result); // 输出:[4, 8, 15, 21, 11]
哪种方式更优?
对于你的需求来说,第一种方案更简洁,一步就能完成,还能帮你熟悉map的完整参数用法;第二种方案拆分了逻辑,适合新手理解数组的截取和拼接操作。两种方式都能达到预期效果,你可以根据自己的理解习惯选择~
另外要记住:数组的索引是从0开始的,最后一个元素的索引永远是数组长度 - 1,这个小细节能帮你避免很多类似的数组遍历问题哦!
内容的提问来源于stack exchange,提问作者Thor Christensen
相关产品推荐
相关产品推荐

