数组求和

数组求和是这样描述的:

计算给定数组 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;
    });
}

function sum(arr) {
    var sum=0;
arr.map(function(item,index){
        sum+=item;
    });
    return sum
}

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 语句。







  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值