8個JS的reduce使用實例和reduce操作方式
reduce
方法是一個數組的迭代方法,和map
、filter
不同,reduce
方法可緩存一個變量,迭代時我們可以操作這個變量,然後返回它。
這是我大白話的解釋,可能還是不容易理解,下面看例子吧
1. 數組累加
數組累加是項目經常遇到的,比如計算商品總價等,使用reduce
就可以一行代碼搞定,而且不用定義外部變量,reduce是完全無副作用的函數。
// 累加 [1, 2, 3, 4, 5, 6, 7, 8].reduce((a, i) => a + i); // 輸出:36 // 累加,默認一個初始值 [1, 2, 3, 4, 5, 6, 7, 8].reduce((a, i) => a + i, 5); // 輸出:41 // 累乘 [1, 2, 3, 4, 5, 6, 7, 8].reduce((a, i) => a * i); // 輸出:40320
2. 找出數組最大值
在數組每次的迭代中,我們使用Math.max
獲取最大值並返回,最後我們將得到數組所有項目的最大值。
[1, 2, 3, 4, 5, 6, 7, 8].reduce((a, i) => Math.max(a, i));
當然如果數組每項都是數字我們可以使用…展開運算符和Math.max
配合。
Math.max(...[1, 2, 3, 4, 5, 6, 7, 8]);
3. 處理不規則數組
通過map
和reduce
配合使用,返回每個子數組拼接好的結果。
let data = [ ["紅色","128g", "蘋果手機"], ["南北","兩室一廳","128㎡","洋房住宅"], ["小米","白色","智能運動手表","心率血壓血氧","來電信息提醒"], ["官方發售","2020年秋季","籃球","球鞋","品牌直郵"] ] let dataConcat = data.map(item=>item.reduce((a,i)=>`${a} ${i}`)) // 輸出結果: ["紅色 128g 蘋果手機" "南北 兩室一廳 128㎡ 洋房住宅" "小米 白色 智能運動手表 心率血壓血氧 來電信息提醒" "官方發售 2020年秋季 籃球 球鞋 品牌直郵"]
4. 刪除數據重復項
檢查當前迭代項是否存在,如果不存在添加到數組中。
let array = [1, 2, 3, 'a', 'b', 'c', 1, 2, 3, 'a', 'b', 'c']; array.reduce((noDupes, curVal) => { if (noDupes.indexOf(curVal) === -1) { noDupes.push(curVal) } return noDupes }, []) // 輸出:[1, 2, 3, 'a', 'b', 'c']
5. 驗證括號是否合法
這是一個很巧妙的用法,我在dev.to上看到的用法。如果結果等於0說明,括號數量是合法的。
[..."(())()(()())"].reduce((a,i)=> i === '(' ? a+1 : a-1 , 0); // 輸出:0 // 使用循環方式 let status=0 for (let i of [..."(())()(()())"]) { if(i === "(") status = status + 1 else if(i === ")") status = status - 1 if (status < 0) { break; } }
6. 按屬性分組
按照指定key將數據進行分組,這裡我用國傢字段分組,在每次迭代過程中檢查當前國傢是否存在,如果不存在創建一個數組,將數據插入到數組中。並返回數組。
let obj = [ {name: '張三', job: '數據分析師', country: '中國'}, {name: '艾斯', job: '科學傢', country: '中國'}, {name: '雷爾', job: '科學傢', country: '美國'}, {name: '鮑勃', job: '軟件工程師', country: '印度'}, ] obj.reduce((group, curP) => { let newkey = curP['country'] if(!group[newkey]){ group[newkey]=[] } group[newkey].push(curP) return group }, []) // 輸出: [ 中國: [{…}, {…}] 印度: [{…}] 美國: [{…}] ]
7. 數組扁平化
這裡展示的數組隻有一級深度,如果數組是多級可以使用遞歸來進行處理
[[3, 4, 5], [2, 5, 3], [4, 5, 6]].reduce((singleArr, nextArray) => singleArr.concat(nextArray), []) // 輸出:[3, 4, 5, 2, 5, 3, 4, 5, 6]
當然也可以使用ES6的.flat方法替代
[ [3, 4, 5], [2, 5, 3], [4, 5, 6] ].flat();
8. 反轉字符串
這也是一種很奇妙的實現方法
[..."hello world"].reduce((a,v) => v+a)
或者
[..."hello world"].reverse().join('')
推薦閱讀:
- JS前端面試數組扁平化手寫flat函數示例
- js實現數組的扁平化
- 梳理總結25JavaScript數組操作方法實例
- JavaScript數組reduce常見實例方法
- JS數組reduce你不得不知道的25個高級用法