个人学习记录
reduce返回一个新数组,不改变原数组
使用场景
- 去重
- 扁平化数组
- 累加
- 字符出现的次数,最大值,最小值
- 按属性进行分类
语法
arr.reduce(callback,initValue)
callback回调函数
- previousValue:上一次调用
callbackFn时的返回值。在第一次调用时,若指定了初始值initialValue,其值则为initialValue,否则为数组索引为 0 的元素array[0] - currentValue:当前值,设置了初始值则值为
array[0],否则值为array[1] - currentIndex:当前值index,设置了初始值则index为0,否则index为1
- array:遍历的数组
initvalue初始值
去重
let arr = [1, 2, 3, 1, 2];
let uniqueArr = arr.reduce((acc, cur) => acc.includes(cur) ? acc : [...acc, cur], []);
console.log(uniqueArr); // [1, 2, 3]
扁平化数组
let arr = [1,2,[3,4],[5,6]].reduce((pre,cur) => {
return pre.concat
},[])
console.log(pre) // [1,2,3]
// 多维数组扁平化 递归
let arr = [[1, [2, 8]], [3, 4, 9], [5, [6, 10]]]
function fn(arr) {
return arr.reduce((pre, cur) => {
// 判断当前值是否为数组
return pre.concat(Array.isArray(cur) ? fn(cur) : cur);
}, []);
}
const newArr = fn(arr);
console.log(newArr); //[1, 2, 8, 3, 4, 9, 5, 6, 10]
也可以使用Array.flat扁平化数组
let arr = [1,2,[3,4]].flat()// [1,2,3,4]
// 遇到多维数组可以传递参数 传递3 扁平化3维数组
let arr = [1,2,[3,4,[5,6]]].flat(3)// [1,2,3,4,5,6]
累加
let sum = [1,2,3,4,5].reduce((pre,cur) => { return pre + cur }) // 15
// 引用数据求和
let sum = [{value : 1},{value : 2},{value : 3}].reduce((pre,cur) => {
return pre + cur.value
},0)
字符出现次数,最大值,最小值
let str = 'abcdabcdabcdab'.split('')
let res = str.reduce((pre,cur) => {
// 判断是否有pre[cur]这个属性值
pre[cur]? pre[cur]++ : pre[cur] = 1
return pre
},{})
console.log(res) // {a:3,b:3,c:2,d:2}
// 最大值
let maxNum = Math.max(... new Set(Object.values(res)))
// 出现最多的字符
let num;
for(let key in res){
if(res[key] == maxNum){
num = key
}
}
// 最大值
arr.reduce((pre,cur)=>{ return Math.max(pre,cur) }
arr.reduce((pre,cur)=>{ return Math.min(pre,cur) }
按属性进行分类
let people = [
{ name: 'Alice', age: 21 },
{ name: 'Max', age: 20 },
{ name: 'Jane', age: 20 }
];
function groupBy(objectArray, property) {
return objectArray.reduce((pre, cur) => {
// cur['age'] 的属性值
let key = cur[property]
// 判断是否有 这个key属性
pre[key] ? pre[key].push(cur) : pre[key] = [cur]
}
let groupedPeople = groupBy(people, 'age')
// groupedPeople is:
// {
// 20: [
// { name: 'Max', age: 20 },
// { name: 'Jane', age: 20 }
// ],
// 21: [{ name: 'Alice', age: 21 }]
// }