前言
之前在撸 JavaScript 书的时候对 reduce 方法有过一面之缘,不过由于 for、forEach、filter、find 都过于强大,在实际开发中一直也没使用过 reduce。偶然发现 reduce 数组去重的方法,看起来很神奇,就探究一下吧~
一 关于reduce
array.reduce(function(accumulator, currentValue, currentIndex, array), initialValue)
它由一个回调函数与一个初始值组成,其中回调函数接受四个参数。
-
initialValue 第一次执行时的初始值,是一个可选值
-
accumulator 是 reduce 方法多次执行的累积结果,accumulator 的初始值分两种情况:
若有提供 initialValue 初始值,第一次循环时 accumulator 的值便为 initialValue,后续循环时 accumulator 为上次循环的返回值;
若未提供initialValue,第一次循环时 accumulator 的值为数组第一项arr[0],后续循环时为上次循环的返回值。 -
currentValue 数组循环处理的当前值。
currentValue 的初始值也受到initialValue的影响:
若有提供 initialValue 初始值,第一次循环currentValue 的值为数组第一项arr[0],后续变化随索引递增变化;
若未提供initialValue,第一次循环由于arr[0]成了accumulator 的值,所以currentValue 只能从arr[1]开始,后续变化随索引递增。
4.currentIndex 数组循环当前处理值的索引,currentValue 与 currentIndex是同步变化的。
5.array 当前正在被循环的数组。
小结
如果 reduce 有提供初始值,则循环从索引 0 开始,此时 accumulator 就是 initialValue,currentValue 值就是 arr[0];
如果 reduce 未提供初始值,则 arr[0] 作为初始值赋予给 accumulator,循环从索引1开始,currentValue 值就是 arr[1] 了
二 使用注意
若数组为空且没有初始值,reduce方法报错。
[].reduce(() => console.log(1)); //报错
三 数组去重
// @arr 要去重的数组
// @id 根据唯一id去重数组
function delRepeat ({ arr, id }) {
let obj = {};
arr = arr.reduce((a, b) => {
obj[b[id]] ? '' : obj[b[id]] = true && a.push(b);
return a;
}, []);
return arr;
}
如果本文对你有所帮助,感谢点一颗小心心,您的支持是我继续创作的动力!
最后:写作不易,如要转裁,请标明转载出处。
网友评论