最近和同事 A 聊天聊到
es6
一些基础知识,在问到reduce
时,同事给个人回答是:‘不就是用来求和的吗’ ??? ‘你肯定 ???’前端
应该有很多童鞋确定也是这样认为的吧,由于在通常基础性的教程中,举例最多的就是数组求和。其实
reduce
还要不少妙用。下面咱们就来看看神奇的reduce
es6
reduce()方法能够搞定的东西,for 循环,或者 forEach 方法有时候也能够搞定,那为啥要用 reduce()?这个问题,以前我也想过,要说缘由还真找不到,惟一能找到的是:通往成功的道路有不少,可是总有一条路是最捷径的,亦或许 reduce()逼格更高...数组
arr.reduce(callback,[initialValue])
复制代码
reduce 为数组中的每个元素依次执行回调函数callback
,不包括数组中被删除或从未被赋值的元素,接受四个参数
:markdown
当设置了initialValue
参数时,callback
第一个参数 初始值
将默认是 initialValue
。函数
先看一个例子:post
var arr = [1, 2, 3, 4];
var sum = arr.reduce(function(prev, cur, index, arr) {
console.log(prev, cur, index);
return prev + cur;
})
console.log(arr, sum);
复制代码
打印结果:ui
这是一个最经典的数组求和
的例子,也是reduce
最简单使用,这个例子index
是从0
开始的,第一次的prev
的值是咱们设置的初始值0
,数组长度是 4,reduce 函数循环4次
。spa
注意:若是这个数组为空,运用 reduce 是什么状况?3d
var arr = [];
var sum = arr.reduce(function(prev, cur, index, arr) {
console.log(prev, cur, index);
return prev + cur;
})
复制代码
可是要是咱们设置了初始值就不会报错,以下:code
var arr = [];
var sum = arr.reduce(function(prev, cur, index, arr) {
console.log(prev, cur, index);
return prev + cur;
},0)
console.log(arr, sum);
复制代码
var arr = [1, 2, 3, 4];
var sum = arr.reduce((x,y)=>x+y)
var mul = arr.reduce((x,y)=>x*y)
console.log( sum ); //求和,10
console.log( mul ); //求乘积,24
复制代码
var arr = [1, 2, 3, 4];
var max = arr.reduce(function (prev, cur) {
return Math.max(prev,cur);
});
console.log(max) // 4
复制代码
var arr = [1, 2, 3, 4, 5, 4, 3, 2, 1];
var newArr = arr.reduce(function (prev, cur) {
prev.indexOf(cur) === -1 && prev.push(cur);
return prev;
},[]);
console.log(newArr) // [1, 2, 3, 4, 5]
复制代码
let names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];
let nameNum = names.reduce((pre,cur)=>{
if(cur in pre){
pre[cur]++
}else{
pre[cur] = 1
}
return pre
},{})
console.log(nameNum); //{Alice: 2, Bob: 1, Tiff: 1, Bruce: 1}
复制代码
let arr = [[0, 1], [2, 3], [4, 5]]
let newArr = arr.reduce((pre,cur)=>{
return pre.concat(cur)
},[])
console.log(newArr); // [0, 1, 2, 3, 4, 5]
复制代码
let arr = [[0, 1], [2, 3], [4,[5,6,7]]]
const newArr = function(arr){
return arr.reduce((pre,cur)=>pre.concat(Array.isArray(cur)?newArr(cur):cur),[])
}
console.log(newArr(arr)); //[0, 1, 2, 3, 4, 5, 6, 7]
复制代码
let data = [{
name: 'tom',
id: 1
},
{
name: 'jack',
id: 2
},
{
name: 'sam',
id: 3
},
{
name: 'mike',
id: 1
},
{
name: 'amy',
id: 2
},
{
name: 'eric',
id: 3
}
]
let hash = {}
data = data.reduce((item, next) => {
// 根据 id 去重
if (!hash[next.id]) {
hash[next.id] = true
item.push(next)
}
return item
}, [])
console.log(hash) // {1: true, 2: true, 3: true}
console.log(data)
复制代码
compose
函数什么是
compose
函数 ?不了解的话能够看看掘金大佬的一篇文章:juejin.cn/post/698902…
function compose(...funs) {
if (funs.length === 0) {
return arg => arg;
}
if (funs.length === 1) {
return funs[0];
}
return funs.reduce((a, b) => (...arg) => a(b(...arg)))
}
复制代码
该方法用法与reduce()实际上是相同的,只是遍历的顺序相反,它是从数组的最后一项开始,向前遍历到第一项。
更多用法还请关注公众号:
前端开发爱好者
持续更新