JavaScript学习笔记之数组求和方法


Posted in Javascript onMarch 23, 2016

推荐阅读:JavaScript学习笔记之数组的增、删、改、查

通过最近学习,越来越感觉JavaScript的强大与魅力之处,仅数组一个知识点就让我这样的初学者折腾了很久。折腾是折腾,但还是很有效果的,这几天的学习到的一些基本知识,就在自己的业务就用到了。顿感自信心爆棚,我也有一天能学会JavaScript。

别的不多说了,咱们今天一起来玩数组的求和,看看有哪些方法可以实现数组的求和。

数组方法

JavaScript中数组有很多种方法,下图能更好的向你阐述JavaScript有多少种方法,作用是啥:

JavaScript学习笔记之数组求和方法

简单点回顾一下前面学习的知识:

push():向数组末尾添加一个或多个元素

unshift(): 向数组的开头添加一个或多个元素

pop(): 删除数组最后一个元素

shift(): 删除数组第一个元素

sort(): 给数组排序

reverse(): 颠倒数组项在数组中的位置

concat(): 合并数组

slice(): 指定的位置开始删除指定的数组项,并且将删除的数组项构建成一个新数组

splice(): 对一个数组做删除、插入和替换

indexOf(): 从前向后查找元素在数组中位置

lastIndexOf(): 从后向前查找元素在数组中位置

forEach()、every()、some()、filter()和map():数组迭代

reduce(): 数组中的每个值(从左到右)开始合并,最终为一个值

reduceRight(): 数组中的每个值(从右到左)开始合并,最终为一个值

数组求和

今天的用例,假设我们有一个这样的数组:

var arr = [0,1,2,3,4,5,6,7,8,9];

需要将数组中的项值加起来0+1+2+3+4+5+6+7+8+9。我们应该怎么做,或者有哪些方法可以实现。简单的讲,就是想办法让数组项一个一个加起来。那是不是就要用到数组的迭代呢?是不是也可以借助这些方法实现数组的求和呢?

for循环和while循环

首先想到的就是这两种循环方法,这在上一节也尝试过了。再次??乱幌拢?/p>

// 求和:for循环遍历数组arr
(function() {
var sum = 0;
function getSum(array){
for (var i = 0; i < array.length; i++){
sum += parseInt(array[i]);
}
return sum;
}
console.time("getSum");
for (var i = 0; i < 1000000; i++){
sum = 0;
getSum(arr);
}
console.timeEnd("getSum"); // 7877.155ms
console.log("使用for循环:sum = " + sum); // 45
})();

再来换个while看看:

(function () {
var sum = 0;
function getSum(array) {
var i = array.length;
while (i--) {
sum += parseInt(array[i]);
}
return sum;
}
console.time("getSum");
for (var i = 0; i < 1000000; i++) {
var sum = 0;
getSum(arr);
}
console.timeEnd("getSum"); // getSum: 7690.056ms 
console.log("使用while循环:sum=" + sum); // 使用while循环:sum=45
})();

除了古老的for和while循环之外,在ES5中还新增加了其他的数组迭代方法,比如forEach()、every()、some()、filter()和map()等。而且这些方法都可以让数组中的每一个元素执行一次回调函数。如果一来,只需要对这个回调函数做一个数组项的累加功能:

function getSum (item, index, array){
sum += item;
}

forEach()方法

forEach()方法让数组每一项执行给定的回调函数callbackfn。这样,我们可以在回调函数getSum做一个累加计算。

(function (){
var sum = 0;
function getSum (item, index, array){
sum += item;
}
console.time("getSum");
for (var i = 0; i < 1000000; i++){
var sum = 0;
arr.forEach(getSum);
}
console.timeEnd("getSum"); // getSum: 1348.212ms
console.log("使用forEach循环:sum=" + sum); // 使用forEach循环:sum=45
})()

some()方法

(function (){
var sum = 0;
function getSum (item, index, array){
sum += item;
}
console.time("getSum");
for (var i = 0; i < 1000000; i++){
var sum = 0;
arr.some(getSum);
}
console.timeEnd("getSum"); // getSum: 1038.737ms
console.log("使用some循环:sum=" + sum); // 使用some循环:sum=45
})()

map()方法

(function (){
var sum = 0;
function getSum (item, index, array){
sum += item;
}
console.time("getSum");
for (var i = 0; i < 1000000; i++){
var sum = 0;
arr.map(getSum);
}
console.timeEnd("getSum"); // getSum: 4568.558ms
console.log("使用map循环:sum=" + sum); // 使用map循环:sum=45
})()

filter()方法

(function (){
var sum = 0;
function getSum (item, index, array){
sum += item;
}
console.time("getSum");
for (var i = 0; i < 1000000; i++){
var sum = 0;
arr.filter(getSum);
}
console.timeEnd("getSum"); // getSum: 1117.039ms
console.log("使用filter循环:sum=" + sum); // 使用filter循环:sum=45
})()

every()方法

every()方法和前面几种方法略有不同,因为every()方法只有数组中每一项执行回调函数结果合部为true才会返回,不然就会返回false。因为在前面的回调函数中,需要增加return true;

(function() {
var sum = 0;
function getSum(item, index, array) {
sum += item;
return true;//由于every方法是会在遇到回调函数返回的第一个false时停止遍历所以需要始终返回true
};
console.time("getSum");
for (var i = 0; i < 1000000; i++){
sum = 0;
arr.every(getSum);
}
console.timeEnd("getSum"); // 1028.892ms
console.log("使用every循环:sum = " + sum); // 使用every循环:sum = 45
})();

reduce()和reduceRight()方法

reduce()和reduceRight()方法可以接受一个回调函数callbackfn作为累加器(accumulator),数组中的每个值(从左到右)开始合并,最终为一个值。这样也能让数组每个元素累加起来,达到数组求和的功能。

先创建一个累加器的回调函数:

function getSum(preValue,curValue,index,array) {
return preValue += curValue;
}

同样以前面的数组为例:

function getSum(preValue,curValue,index, array) {
return preValue + curValue;
}
console.time("getSum");
for (var i = 0; i < 1000000; i++){
sum = arr.reduce(getSum, 0)
}
console.timeEnd("getSum"); // 3257.201ms
console.log("使用reduce循环:sum = " + sum); // 使用reduce循环:sum = 45

前面测试,reduce()方法所费时间最短,本篇在测试似乎所费时间最长,不知道在哪出错了,还望有大神能指导迷津。
reduceRight()方法和reduce()方法一样,只是他从数组的右边向左边累加。

总结

一个一个操作下来,数组的求和基本上通过数组遍历来实现,那么掌握了数组中各种遍历的方法,就能轻松的实现数组的求和。虽然这些遍历的方法能让实现数组的求和,但是不同的方法对性能有所不同。文章中的示例可能无法完全阐述他们性能方面的对比,如果您有更好的建议欢迎分享。

以上内容是针对JavaScript学习笔记之数组求和方法的全部介绍,希望对大家有所帮助!

Javascript 相关文章推荐
jQuery动态地获取系统时间实现代码
May 24 Javascript
js 跳出页面的frameset框架示例介绍
Dec 23 Javascript
JavaScript获取DOM元素的11种方法总结
Apr 25 Javascript
Google 地图API资料整理及详细介绍
Aug 06 Javascript
AngularJS 单元测试(二)详解
Sep 21 Javascript
详解Javascript中DOM的范围
Feb 13 Javascript
vue子组件使用自定义事件向父组件传递数据
May 27 Javascript
浅谈Node.js爬虫之网页请求模块
Jan 11 Javascript
基于cropper.js封装vue实现在线图片裁剪组件功能
Mar 01 Javascript
vue中引用swiper轮播插件的教程详解
Aug 16 Javascript
element-ui 中的table的列隐藏问题解决
Aug 24 Javascript
layui lay-verify form表单自定义验证规则详解
Sep 18 Javascript
JavaScript学习笔记之数组的增、删、改、查
Mar 23 #Javascript
高效利用Angular中内置服务$http、$location等
Mar 22 #Javascript
BootStrap实用代码片段之一
Mar 22 #Javascript
Javascript中的几种继承方式对比分析
Mar 22 #Javascript
JS函数定义方式的区别介绍
Mar 22 #Javascript
基于javascript制作经典传统的拼图游戏
Mar 22 #Javascript
javascript函数命名的三种方式及区别介绍
Mar 22 #Javascript
You might like
php 批量生成html,txt文件的实现代码
2013/06/26 PHP
修改ThinkPHP缓存为Memcache的方法
2014/06/25 PHP
php随机取mysql记录方法小结
2014/12/27 PHP
PHP中使用break跳出多重循环代码实例
2015/01/21 PHP
360搜索引擎自动收录php改写方案
2018/04/28 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
2019/11/24 PHP
解决IE下select标签innerHTML插入option的BUG(兼容IE,FF,Opera,Chrome,Safari)
2010/05/13 Javascript
JavaScript获取onclick、onchange等事件值的代码
2013/07/22 Javascript
JavaScript异步编程:异步数据收集的具体方法
2013/08/19 Javascript
JavaScript闭包实例讲解
2014/04/22 Javascript
PHP配置文件php.ini中打开错误报告的设置方法
2015/01/09 PHP
js的toLowerCase方法用法实例
2015/01/27 Javascript
Javascript编写俄罗斯方块思路及实例
2015/07/07 Javascript
JavaScript实现简洁的俄罗斯方块完整实例
2016/03/01 Javascript
Bootstrap3 datetimepicker控件使用实例
2016/12/13 Javascript
浅谈Vue下使用百度地图的简易方法
2018/03/23 Javascript
Vue 自定义动态组件实例详解
2018/03/28 Javascript
react-native聊天室|RN版聊天App仿微信实例|RN仿微信界面
2019/11/12 Javascript
[58:18]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Mineski
2018/03/30 DOTA
Python双精度浮点数运算并分行显示操作示例
2017/07/21 Python
PyTorch中Tensor的维度变换实现
2019/08/18 Python
浅谈python输出列表元素的所有排列形式
2020/02/26 Python
查看jupyter notebook每个单元格运行时间实例
2020/04/22 Python
详解Pandas 处理缺失值指令大全
2020/07/30 Python
python的launcher用法知识点总结
2020/08/07 Python
日本AOKI官方商城:AOKI西装
2020/06/11 全球购物
如何实现一个自定义类的序列化
2012/05/22 面试题
医学专业个人求职自荐信格式
2013/09/23 职场文书
会务接待方案
2014/02/27 职场文书
大学生个人求职信例文
2014/07/07 职场文书
舞蹈兴趣小组活动总结
2014/07/07 职场文书
2014年安全生产工作总结
2014/11/13 职场文书
家长学校教学计划
2015/01/19 职场文书
2020年基层司法所建设情况调研报告
2019/11/30 职场文书
python中Tkinter 窗口之输入框和文本框的实现
2021/04/12 Python
PHP遍历数组的6种方式总结
2021/11/17 PHP