今天,主要是来总结一下数组几个常用方法之一的reduce方法,最常见的使用就是用来求和,但它还有更多骚操作呀!
  reduce(callback,initialValue)会传入两个参数,回调函数(callback)和初始值(initialValue)。当没有传入初始值时,prev是从数组中第一个元素开始的,next是数组的第二个元素;当传入初始值(initialValue)后,第一个prev将是initialValue,next将是数组中的第一个元素。
  熟悉了概念后,多练习就可以开始写出各种骚操作简化代码了。


一、统计数组元素出现次数

  借用力扣的一道题来说明reduce在统计出现次数是多好使。
   题目来自力扣面试题53-1. 在排序数组中查找数字 1

JavaScript Solution

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var search = function(nums, target) {
    let numsIndex = nums.reduce((prev,curr)=>{
            if(curr in prev){    //这里判断curr是否在prev中,记得return
                prev[curr]++
            }else{
                prev[curr] = 1
            }
            return prev
    },{})  // prev相当于这里的{}

    return numsIndex[target] || 0
};

  更甚者的写法,真是很灵活的一个方法。

var search = function(nums, target) {
    let numsIndex = nums.reduce((prev,curr)=>{
        prev[curr] = prev[curr] + 1 || 1    //善用||简化代码
        return prev
    },{})

    return numsIndex[target] || 0
}

二、数组去重

  使用方法与第一部分类似,直接上代码,在代码里贴注释分析。

let arr = [1,2,2,2,3,4,4,1]
let newArr = arr.reduce((prev,curr)=>{
    if(!prev.includes(curr)){  //没有此元素则连接
      return prev.concat(curr)    
    }else{
      return prev    //有则跳过
    }
},[])  //prev相当于这里的[]
console.log(newArr);// [1, 2, 3, 4]

三、数组降维

  这部分,也是同样的跟前面两部分类似一样的用法,只不过这里分二维和多维,多维的操作是一个递归处理。

二维降维

let arr = [[0, 1], [2, 3], [4, 5]]
let newArr = arr.reduce((prev,curr)=>{
    return prev.concat(curr)
},[])
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((prev,curr)=>{
     return prev.concat(Array.isArray(curr)?newArr(curr):curr
     }),[])
}
console.log(newArr(arr)); //[0, 1, 2, 3, 4, 5, 6, 7]

  其实,关于数组降维,还有一个更加简便的方法,针对字符串更好用,如果是number的话,还需要多一步处理,具体代码如下:

let arr = [12,23,[3,4],[56,7,[89,10]]]
let newarr = arr.toString().split(",").map(v=>parseInt(v))  //number多一步映射回去的操作
console.log(newarr); //[12 ,23 ,3 ,4 ,56 ,7 ,89 ,10]

四、求和、求积……

  这里就不赘述了,直接上代码,或者其他普通计算,都比较直接的使用就好。

求和

var sum = function(nums){
    return nums.reduce((prev,curr)=>prev+curr)
}
let nums = [1,2,3,4,5,6,7,8,9,10]
console.log(sum(nums))

求积

var product = function(nums){
    return nums.reduce((prev,curr)=>prev*curr)
}
let nums = [10,9,8,7,6,5,4,3,2,1]
console.log(product(nums))

注:部分内容参考自JS数组reduce()方法详解及高级技巧