ES6 reduce 減小你的麪條式代碼【初中級前端必會】| 8月更文挑戰

前言

最近和同事 A 聊天聊到es6一些基礎知識,在問到reduce時,同事給個人回答是:‘不就是用來求和的嗎’ ??? ‘你肯定 ???’前端

應該有很多童鞋確定也是這樣認爲的吧,由於在通常基礎性的教程中,舉例最多的就是數組求和。其實reduce還要不少妙用。下面咱們就來看看神奇的reducees6

介紹

reduce()方法能夠搞定的東西,for 循環,或者 forEach 方法有時候也能夠搞定,那爲啥要用 reduce()?這個問題,以前我也想過,要說緣由還真找不到,惟一能找到的是:通往成功的道路有不少,可是總有一條路是最捷徑的,亦或許 reduce()逼格更高...數組

reduce 語法

arr.reduce(callback,[initialValue])
複製代碼

callback 詳解

reduce 爲數組中的每個元素依次執行回調函數callback,不包括數組中被刪除或從未被賦值的元素,接受四個參數markdown

  • 初始值(或者上一次回調函數的返回值)
  • 當前元素值
  • 當前索引
  • 調用 reduce 的數組

initialValue(可選參數)

當設置了initialValue參數時,callback 第一個參數 初始值將默認是 initialValue函數

先看一個例子:post

var arr = [1, 2, 3, 4];
var sum = arr.reduce(function(prev, cur, index, arr) {
    console.log(prev, cur, index);
    return prev + cur;
})
console.log(arr, sum);
複製代碼

打印結果:ui

這是一個最經典的數組求和的例子,也是reduce最簡單使用,這個例子index是從0開始的,第一次的prev的值是咱們設置的初始值0,數組長度是 4,reduce 函數循環4次spa

注意:若是這個數組爲空,運用 reduce 是什麼狀況?3d

var  arr = [];
var sum = arr.reduce(function(prev, cur, index, arr) {
    console.log(prev, cur, index);
    return prev + cur;
})
複製代碼

可是要是咱們設置了初始值就不會報錯,以下:code

var  arr = [];
var sum = arr.reduce(function(prev, cur, index, arr) {
    console.log(prev, cur, index);
    return prev + cur;
},0)
console.log(arr, sum);
複製代碼

reduce 簡單用法

  1. 數組求和,求乘積
var  arr = [1, 2, 3, 4];
var sum = arr.reduce((x,y)=>x+y)
var mul = arr.reduce((x,y)=>x*y)
console.log( sum ); //求和,10
console.log( mul ); //求乘積,24
複製代碼
  1. 求數組項最大值
var  arr = [1, 2, 3, 4];
var max = arr.reduce(function (prev, cur) {
    return Math.max(prev,cur);
});
console.log(max) // 4
複製代碼
  1. 數組去重
var  arr = [1, 2, 3, 4, 5, 4, 3, 2, 1];
var newArr = arr.reduce(function (prev, cur) {
    prev.indexOf(cur) === -1 && prev.push(cur);
    return prev;
},[]);
console.log(newArr) // [1, 2, 3, 4, 5]
複製代碼

reduce 高級用法

  1. 計算數組中每一個元素出現的次數
let names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];

let nameNum = names.reduce((pre,cur)=>{
  if(cur in pre){
    pre[cur]++
  }else{
    pre[cur] = 1
  }
  return pre
},{})
console.log(nameNum); //{Alice: 2, Bob: 1, Tiff: 1, Bruce: 1}
複製代碼
  1. 將二維數組轉化爲一維
let arr = [[0, 1], [2, 3], [4, 5]]
let newArr = arr.reduce((pre,cur)=>{
    return pre.concat(cur)
},[])
console.log(newArr); // [0, 1, 2, 3, 4, 5]
複製代碼
  1. 將多維數組轉化爲一維
let arr = [[0, 1], [2, 3], [4,[5,6,7]]]
const newArr = function(arr){
   return arr.reduce((pre,cur)=>pre.concat(Array.isArray(cur)?newArr(cur):cur),[])
}
console.log(newArr(arr)); //[0, 1, 2, 3, 4, 5, 6, 7]
複製代碼
  1. 對象數組去重
let data = [{
    name: 'tom',
    id: 1
  },
  {
    name: 'jack',
    id: 2
  },
  {
    name: 'sam',
    id: 3
  },
  {
    name: 'mike',
    id: 1
  },
  {
    name: 'amy',
    id: 2
  },
  {
    name: 'eric',
    id: 3
  }
]

let hash = {}
data = data.reduce((item, next) => {
  // 根據 id 去重
  if (!hash[next.id]) {
    hash[next.id] = true
    item.push(next)
  }
  return item
}, [])
console.log(hash) // {1: true, 2: true, 3: true}
console.log(data)
複製代碼
  1. compose 函數

什麼是 compose 函數 ?不瞭解的話能夠看看掘金大佬的一篇文章:juejin.cn/post/698902…

function compose(...funs) {
    if (funs.length === 0) {
        return arg => arg;
    }
    if (funs.length === 1) {
       return funs[0];
    }
    return funs.reduce((a, b) => (...arg) => a(b(...arg)))

}
複製代碼

其它相關方法

reduceRight()

該方法用法與reduce()實際上是相同的,只是遍歷的順序相反,它是從數組的最後一項開始,向前遍歷到第一項。

forEach()、map()、every()、some()和filter()

更多用法還請關注公衆號:前端開發愛好者 持續更新

相關文章
相關標籤/搜索