js算法中reduce思想的应用

写在前面的话

reduce是数组的一个方法,我认为更是一中算法思想,关于reduce,请查看reduce的文档
算法是一个程序员必备的一项技能,因为程序本身就是一种算法。算法对一个前端开发者至关重要,虽然说算法跟个人的逻辑能力有一定关系,但是勤能补拙,我相信只要肯努力,这些都不是问题,因为对程序员来说,算法是一种能力,是可以培养的,这需要一个过程。告诉你一个秘,去leetcode上每天完成一道算法题。三个月之后,你就有所领悟了,三年之后,你就看破红尘了。

一些常见的算法题

下面的算法都例举一种reduce ,reduce可以实现很多种算法,而且效率高

数组各项相加方法有很多种

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//for循环
var arr = [1,2,3,4,5];
Array.prototype.sum0 = function (){
var sumResult = 0;
for (var i = 0; i < this.length; i++) {
sumResult += parseInt(this[i]);
}
return sumResult;
}
console.log(arr.sum0()); // 15
//使用reduce
var arr1 = [1,2,3,4,5];
Array.prototype.sum1 = function (){
var sumResult = 0;
return this.reduce (function (preValue, curValue) {
return preValue + curValue;
})
return sumResult;
}
console.log(arr1.sum1()); // 15

之前做了个测验,for循环和reduce两种方法累加的速度比较。在我的github中有,去查看

去重
数组去重,数组的reduce方法去重很酷的

1
2
3
4
5
6
7
function Duplicate(arr){
return arr.reduce(function(pre,next){
pre.indexOf(next)>-1 ? '' : pre.push(next)
return pre
},[])
}
console.log(Duplicate([1,2,2,2,2,3,3,4]))

扁平化多维数组

1
2
3
4
5
6
function flat(arr){
return arr.reduce(function(pre,next){
return pre.concat(next instanceof Array ?flat(next):next)
},[])
}
flat([1,2,[3,4]])

计算数组中每个元素出现的次数

1
2
3
4
5
6
7
8
function getCount(arr){
return arr.reduce((pre, next) => {
pre[next] ? pre[next]++ : pre[next] = 1
return pre
}, {})
}
var names = ['qq', 'qin', 'qin', 'qq', 'qiang', 'qq', 'qinqiang', 'qiang']
getCount(names)