今天遇到个数组求和的问题,下面收集下我能想到的方式:
首先设定一个作为数据源的数组var arr = [1,2,3,4,5,6];
测试时我不想过度使用全局变量影响命名空间,所以没使用未声明变量。而是直接通过私有作用域设置静态私有变量,也可以用其他设计模式来限定变量作用域。因为数组对象的迭代方法也是一种遍历,所以也可以借助用来实现求和。
一、利用数组对象的各迭代方法:
1.array.every()查询是否有所有项都匹配的方法:
(function() {
var sum = 0;
function getSum(item,index,array) {
sum += item;
console.log(sum);
return true;//由于every<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a>是会在遇到回调<a href="https://www.jb51.cc/tag/hanshu/" target="_blank" class="keywords">函数</a>返回的第一个false时停止遍历所以需要始终返回true
};
arr.every(getSum);
console.log("use every:sum = " + sum);
})();
(function() {
var sum = 0;
function getSum(item,array) {
sum += item;
console.log(sum);
};
arr.some(getSum);
console.log("use some:sum = " + sum);
})();
3.array.filter()获取匹配项构成的数组的方法:
(function() {
var sum = 0;
function getSum(item,array) {
sum += item;
console.log(sum);
};
arr.filter(getSum);
console.log("use filter:sum = " + sum);
})();
4.array.map()遍历数组并返回一个修改后的副本数组的方法:
(function() {
var sum = 0;
function getSum(item,array) {
sum += item;
console.log(sum);
};
arr.map(getSum);
console.log("use map:sum = " + sum);
})();
5.array.froEach()遍历数组的方法:
(function() {
var sum = 0;
function getSum(item,array) {
sum += item;
console.log(sum);
};
arr.forEach(getSum);
console.log("use forEach:sum = " + sum);
})();
二、利用数组对象的归并方法就简单得多,毕竟归并方法本省就是为了做这个的:
1.array.reduce()正向归并方法:
arr.reduce(function(prevResult,item,array) {
return prevResult += item;
});
2.array.reduceRight()逆向归并方法:
arr.reduceRight(function(prevResult,array) {
return prevResult += item;
});
三、常规的for循环和while循环遍历:
1.for循环
(function() {
for (var i = 0,sum = 0; i < arr.length; i++) {
sum += arr[i];
console.log(sum);
}
console.log("use for:sum = " + sum);
})();
2.while循环
(function(){
var i = 0,sum = 0;
while(i代码发现原来for-in语句也可以,因为本质上数组也是个对象,每个数组项都是数组对象的属性,而数组项的下标/索引实际上就是属性的名称,所以可以通过for-in语句遍历数组实例对象的所有可枚举属性([[Enumerable]]设置为true的属性)来作为访问数组时的下标(有没有觉得很像对象的属性的方括号访问方式呢object["propName"]
?)。
以下是console下的命令与返回:
>Object.keys(arr);
<["0","1","2","3","4","5"] //列出arr的可枚举属性
>Object.getOwnPropertyNames(arr);
<["0","5","length"] //列出arr的所有属性,"length"是构造函数给arr对象添加的不可枚举属性
所以数组求和还可以这样玩:
(function() {
var sum = 0;
for (var index in arr) {
sum += arr[index];
console.log(sum);
}
console.log("use for-in:sum = " + sum);
})();
——————————————————若干天后————————————————
五、今天跟@Sparetire同学的交流学习到了数组的迭代方法第二个传入参数的正确使用方式,以及终于真正理解了this
这个动态指针的作用(也就是在哪个执行环境使用它,它就指向这个执行环境的变量对象,如果某些方法可以将某个执行环境A的变量对象绑定到另一个执行环境B,实际上就是使得B内的代码有权方位A的变量对象内的属性和方法,也就是A环境内的变量和函数。)
以下是直接通过forEach()
方法的第二个参数来改进的数组求和方式:
var calc = {
sum: 0
};
function getSum(item,array) {
this.sum += item;
console.log(this.sum);
}
arr.forEach(getSum,calc);
console.log('use forEach and change this:sum=' + calc.sum);
六、再填一法,又是看别人代码发现可以利用global对象的eval()
方法结合Array原型提供的join()
方法来简单的实现数组求和
eval(arr.join("+"));
这里先将所有数组项通过字符串"+"
连为一个字符串"1+2+3+4+5+6"
,然后返回的这个字符串传给eval()
方法,eval()
方法接收了这段字符串后,就直接将这段字符串中的代码放在当前作用域下执行了。
日后发现了其他方式再补……
以上代码直接拷贝到浏览器console执行即可。
原文链接:https://www.f2er.com/note/422438.html