今天,主要是来总结一下数组几个常用方法之一的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()方法详解及高级技巧