数组reduce学习

93 阅读2分钟

个人学习记录

reduce返回一个新数组,不改变原数组

使用场景

  • 去重
  • 扁平化数组
  • 累加
  • 字符出现的次数,最大值,最小值
  • 按属性进行分类

语法

arr.reduce(callback,initValue)

  • callback回调函数
  1. previousValue:上一次调用 callbackFn 时的返回值。在第一次调用时,若指定了初始值 initialValue,其值则为 initialValue,否则为数组索引为 0 的元素 array[0]
  2. currentValue:当前值,设置了初始值则值为array[0],否则值为array[1]
  3. currentIndex:当前值index,设置了初始值则index为0,否则index为1
  4. 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 }]
// }