JS的reduce使用及操作方式
導讀 | reduce方法是JavaScript中一個比較強大的方法,可能在平時開發中,有人根本沒用過,通過下面的8個例子,學會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('')
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2795707/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- js--陣列的reduce()方法的使用介紹JS陣列
- js之reduce的最全用法JS
- JS中reduce方法JS
- 陣列的reduce操作+物件陣列的map操作陣列物件
- JavaScript reduce()的使用JavaScript
- JS嵌入html的方式及各種方式的比較JSHTML
- JS 前20個常用字串方法及使用方式JS字串
- js陣列方法之ReduceJS陣列
- 使用js操作checkboxJS
- python-python的sao操作 map reduce filterPythonFilter
- Array.reduce()方法的使用
- JS Array.prototype.reduce的一些理解JS
- Git操作及使用Git
- 好程式設計師web前端教程分享js reduce方法使用教程程式設計師Web前端JS
- 關於js延遲載入(非同步操作)的方式JS非同步
- js迴圈中reduce的用法簡單介紹JS
- JS 裡的資料型別及幾個操作JS資料型別
- SpringCloud使用Consul時,服務登出的操作方式SpringGCCloud
- 一文搞懂 Java8 reduce操作Java
- 原生JS獲取日期段及時間比較的騷操作(基本操作)JS
- SpringBoot 使用ApplicationContext 及 getbean的兩種方式Spring BootAPPContextBean
- node.js使用Sequelize 操作mysqlNode.jsMySql
- js防抖和節流的區別及實現方式JS
- JS非同步程式設計的幾種方式及區別JS非同步程式設計
- 【JS 口袋書】第 9 章:使用 JS 操作 HTML 元素JSHTML
- js的dom操作JS
- CentOS簡單操作命令及node.js的安裝方法CentOSNode.js
- Node.js 流的使用及實現Node.js
- reduce的妙用
- js建立物件的方式JS物件
- 擴充套件一下使用reduce的思路套件
- ShadowNode: 以更輕量級的方式使用 Node.jsNode.js
- python列表(list)的使用技巧及高階操作Python
- JS — 物件的基本操作JS物件
- js操作JS
- Spring boot方式使用MyBatis-Plus分頁操作Spring BootMyBatis
- flutter webView 使用以及與 js 互操作FlutterWebViewJS
- Array的reduce方法