核心提示:题目描述计算给定数组 arr 中所有元素的总和输入描述:数组中的元素均为 Number 类型示例输入[ 1, 2, 3, 4 ]输出10注意(首先判断数组长度,这是很容易被大家遗忘的!!!)长度如果为...
题目描述
计算给定数组 arr 中所有元素的总和
输入描述:
数组中的元素均为 Number 类型
示例
输入
[ 1, 2, 3, 4 ]
输出
10
注意
(首先判断数组长度,这是很容易被大家遗忘的!!!)
长度如果为0,直接返回-1;
如果为1,直接返回arr[0]
如果大于1,就是接下来我们要讨论的内容
思路一
使用for循环遍历
function sum(arr) { var sum=0; if(arr.length==0){ return 0; }else if (arr.length==1) { return arr[0]; }else { for(var i=0;i思路二
递归方法
很容易想到使用for循环来解决这个问题,那么你有没有考虑过用递归的方式呢?(不考虑算法的时间复杂度条件下)
function sum(arr){ return arr[0]+sum(arr.slice(1)); }这是使用到一个方法叫slice(),它的参数形式是slice(start,end),返回一个由下标start开始到end之间的新数组(不包括end),如果不指定end,则返回start到数组末尾(包括末尾)
思路三
使用eval
也许你对eval不熟悉或者很陌生,只是依稀记得很多书告诉我们最好别用eval,因为它会存在安全问题
但这并不妨碍我们使用它来解决这个问题
arr.join(‘+’)会返回一个字符串,链接符为“+”
eval()会解析一个字符串参数,并执行里面的js代码
function sum(arr){ return eval(arr.join('+'));//返回一个字符串 }思路四
使用forEach遍历数组
function sum1(arr){ var result=0; arr.forEach( function(element) { result+=element; }); return result; }forEach()需要传入一个回调函数
思路五
最后介绍一个比较冷门的方法,那就是reduce()
reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。
function sum(arr){ arr.reduce(function(total,current){ return total+current; }) }total代表前面的数加起来的总数,current代表当前值
reduce会在每个数组项中调用回调函数
一个简简单单的数组求和居然有这么多种解决方式,你get到了吗?