数组求和方法汇总
var arr = [1, 2, 3, 4, 5, 6];
测试时我不想过度使用全局变量影响命名空间,所以没使用未声明变量。而是直接通过私有作用域设置静态私有变量,也可以用其他设计模式来限定变量作用域。因为数组对象的迭代方法也是一种遍历,所以也可以借助用来实现求和。
一、利用数组对象的各迭代方法:
1.array.every()查询是否有所有项都匹配的方法:
1 (function() { 2 var sum = 0; 3 4 function getSum(item, index, array) { 5 sum += item; 6 console.log(sum); 7 return true;//由于every方法是会在遇到回调函数返回的第一个false时停止遍历所以需要始终返回true 8 }; 9 arr.every(getSum); 10 console.log("use every:sum = " + sum); 11 })();
2.array.some()查询是否有匹配项的方法:
1 (function() { 2 var sum = 0; 3 4 function getSum(item, index, array) { 5 sum += item; 6 console.log(sum); 7 }; 8 arr.some(getSum); 9 console.log("use some:sum = " + sum); 10 })();
3.array.filter()获取匹配项构成的数组的方法:
1 (function() { 2 var sum = 0; 3 4 function getSum(item, index, array) { 5 sum += item; 6 console.log(sum); 7 }; 8 arr.filter(getSum); 9 console.log("use filter:sum = " + sum); 10 })();
4.array.map()遍历数组并返回一个修改后的副本数组的方法:
(function() { var sum = 0; function getSum(item, index, array) { sum += item; console.log(sum); }; arr.map(getSum); console.log("use map:sum = " + sum); })();
5.array.froEach()遍历数组的方法:
1 (function() { 2 var sum = 0; 3 4 function getSum(item, index, array) { 5 sum += item; 6 console.log(sum); 7 }; 8 arr.forEach(getSum); 9 console.log("use forEach:sum = " + sum); 10 })();
二、利用数组对象的归并方法就简单得多,毕竟归并方法本省就是为了做这个的:
1.array.reduce()正向归并方法:
1 arr.reduce(function(prevResult, item, index, array) { 2 return prevResult += item; 3 });
2.array.reduceRight()逆向归并方法:
1 arr.reduceRight(function(prevResult, item, index, array) { 2 return prevResult += item; 3 });
三、常规的for循环和while循环遍历:
1.for循环
1 (function() { 2 for (var i = 0, sum = 0; i < arr.length; i++) { 3 sum += arr[i]; 4 console.log(sum); 5 } 6 console.log("use for:sum = " + sum); 7 })();
2.while循环
1 (function(){ 2 var i = 0, sum = 0; 3 while(i<arr.length){ 4 sum+=arr[i]; 5 console.log(sum); 6 i++; 7 } 8 console.log("use while:sum = " + sum); 9 })();
四、看到其他同学 @xifengxx@小胖不瘦 的代码发现原来for-in语句也可以,因为本质上数组也是个对象,每个数组项都是数组对象的属性,而数组项的下标/索引实际上就是属性的名称,所以可以通过for-in语句遍历数组实例对象的所有可枚举属性([[Enumerable]]设置为true的属性)来作为访问数组时的下标(有没有觉得很像对象的属性的方括号访问方式呢object["propName"]
?)。
以下是console下的命令与返回:
>Object.keys(arr);
<["0", "1", "2", "3", "4", "5"] //列出arr的可枚举属性
>Object.getOwnPropertyNames(arr);
<["0", "1", "2", "3", "4", "5", "length"] //列出arr的所有属性,"length"是构造函数给arr对象添加的不可枚举属性
所以数组求和还可以这样玩:
1 (function() { 2 var sum = 0; 3 for (var index in arr) { 4 sum += arr[index]; 5 console.log(sum); 6 } 7 console.log("use for-in:sum = " + sum); 8 })();
五、今天跟@Sparetire同学的交流学习到了数组的迭代方法第二个传入参数的正确使用方式,以及终于真正理解了this
这个动态指针的作用(也就是在哪个执行环境使用它,它就指向这个执行环境的变量对象,如果某些方法可以将某个执行环境A的变量对象绑定到另一个执行环境B,实际上就是使得B内的代码有权方位A的变量对象内的属性和方法,也就是A环境内的变量和函数。)
以下是直接通过forEach()
方法的第二个参数来改进的数组求和方式:
1 var calc = { 2 sum: 0 3 }; 4 function getSum(item, index, array) { 5 this.sum += item; 6 console.log(this.sum); 7 } 8 arr.forEach(getSum,calc); 9 console.log('use forEach and change this:sum=' + calc.sum);