
简单点回顾一下前面学习的知识:
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循环遍历数组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.155msconsole.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()方法(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.212msconsole.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.737msconsole.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.558msconsole.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.039msconsole.log("使用filter循环:sum=" + sum); // 使用filter循环:sum=45})()every()方法(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.892msconsole.log("使用every循环:sum = " + sum); // 使用every循环:sum = 45})();reduce()和reduceRight()方法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.201msconsole.log("使用reduce循环:sum = " + sum); // 使用reduce循环:sum = 45前面测试,reduce()方法所费时间最短,本篇在测试似乎所费时间最长,不知道在哪出错了,还望有大神能指导迷津。