数组求和是这样描述的:
计算给定数组 arr 中所有元素的总和
输入的要求是这样的:
数组中的元素均为Number类型
实例:
输入:[1,2,3,4]
输出:10
第一种解法:常规
这道题目让我们上来就想到的是for循环对数组元素相加
function sum(arr) {
var s = 0;
for (var i=arr.length-1; i>=0; i--) {
s += arr[i];
}
return s;
}
上边倒序顺序都无所谓的,看需求吧!!!
第二种:forEach
那么顺其自然就想到循环forEach来做,forEach要注意的
在这里可以观察得到::http://blog.csdn.net/u013005050/article/details/78536522
function sum(arr) {
var s = 0;
arr.forEach(function(val, idx, arr) {
s += val;
}, 0);
return s;
};
第三种解法: 递归
function sum(arr) {
var len = arr.length;
if(len == 0){
return 0;
} else if (len == 1){
return arr[0];
} else {
return arr[0] + sum(arr.slice(1));
}
}
是的,在不考虑复杂度的情况下是可以的,slice()-slice(0)是一样的都是对数组全部数据进行浅克隆
slice(1)是指从数组下标是1的位置(包括下标1的值)开始浅克隆到最后一个元素(包括的)
slice(1,4)是指从从数组下标是1的位置(包括下标1的值)开始浅克隆到下标是4的位置(不包括)
如果begin,end为负数则倒着来。。。
注意::如果该元素是个对象引用 (不是实际的对象),slice
会拷贝这个对象引用到新的数组里。两个对象引用都引用了同一个对象。如果被引用的对象发生改变,则新的和原来的数组中的这个元素也会发生改变。
返回值:一个新数组
第三种::函数式编程 map - reduce处理:
function sum(arr) {
return arr.reduce(function(prev, curr, idx, arr){
return prev + curr;
});
}
reduce从兼容方式来说,有需求可以写出判断来进行兼容处理。
数组归并方法:reduce()和reduceRight()这两种方法都接收两个参数:一个在每一项上调用的函数和(可选项)作为归并基础的初始值。传入给reduce()和reduceRight()的函数接收4个参数:前一个值,当前值,项的索引和数组对象。这个函数返回的任何值都会作为第一个参数自动传给下一项。
使用reduce()还是reduceRight(),主要取决于从哪头开始遍历。除此之外他们完全相同。
reduce中第二个参数arr.reduce(callback[,initialValue]);initialValue的讨论::
http://blog.csdn.net/u013005050/article/details/78538486
好友评价:Array的map方法,本意是通过统一的规则获得新的数组,这里语义没forEach好
第四种:eval:
function sum(arr) {
return eval(arr.join("+"));
};
function sum(arr) {
console.log(1000,arr.join('+'));
console.log(2000,eval(arr.join('+')));
return eval(arr.join('+'));
}
sum([1,2,3,4])
1000 "1+2+3+4"
2000 10
10
eval() 函数计算 JavaScript 字符串,并把它作为脚本代码来执行。
如果参数是一个表达式,eval() 函数将执行表达式。如果参数是Javascript语句,eval()将执行 Javascript 语句。