reduce你真的会用吗
或许大家都知道reduce ,但相信一定会有一部分跟我一样只是知道却没怎么用过。不过没关系,看完本文,你会发现reduce 在特地场景有多香。
语法
arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])
参数
作为第一次调用 callback 函数时的第一个参数的值。 如果没有提供初始值,则将使用数组中的第一个元素。 在没有初始值的空数组上调用 reduce 将报错。
返回值
函数累计处理的结果
实例
数组求和
const arr = [1,2,3,4,5];
const result = arr.reduce(function (pre, cur, index, arr) {
console.log('pre:' + pre, 'cur:' + cur, 'index:' + index)
return pre + cur
});
console.log(result);
可以看到它是从数组的第二个元素还是执行的,第一轮pre 的值为数组的第一个元素 1 ,随后每次 加上当前数组位置的值再返回,从而实现累计的过程。
数组去重
const arr = [1,1,3,5,5,7,9];
let arrByFilter = arr.reduce((pre, cur)=> pre.includes(cur) ? pre : pre.concat(cur),[]);
console.log(arrByFilter);
查找字符串的公共前缀
const strArr = ["flower","flow","flight"]
const prefix = strArr.reduce((pre, cur) => {
while (!cur.startsWith(pre)) {
pre = pre.substring(0, pre.length - 1);
}
return pre;
}, strArr[0]);
console.log(prefix);
手写 reduce
Array.prototype.myReduce = function (callback, initialValue) {
if (this == undefined) {
throw new TypeError('this is null or not defined');
}
if (typeof callback !== 'function') {
throw new TypeError(callbackfn + ' is not a function');
}
if (this.length == 0) {
throw new TypeError('Reduce of empty array with no initial value');
}
const O = Object(this);
const len = this.length >>> 0;
let accumulator = initialValue;
let k = 0;
if (accumulator === undefined) {
accumulator = O[k++];
}
for (k; k < len; k++) {
accumulator = callback.call(this, accumulator, O[k], k, O);
}
return accumulator;
}
console.log([2, 4, 6].myReduce((pre, cur) => pre + cur));
console.log([2, 4, 6].myReduce((pre, cur) => pre + cur, 10));
参考:
|