概念一搜一大把,咱們聊點我遇到的和理解的,見代碼javascript
//reduce做爲累加器 let arr = [1, 2, 3, 4, 5] let sum = arr.reduce((init, item, i, self) => { console.log(`init---${init}, item---${item}, i---${i}, self---${self}`) return init + item }) console.log(sum) //15
分別看一下回調參數 見下圖vue
init默認爲數組第一項,一次累加數組項,最後返回一項。
item循環數組每一項
i數組下標
self當前調用reduce數組自己java
可選初始值,做爲回調函數第一個參數的默認值,也是每次回調的返回值,見代碼segmentfault
let obj = { '/home': { meta: { title: '首頁' }, component: '@/page/home' }, '/question': { meta: { title: '問題' }, component: '@/page/question' } } // 轉化爲數組 let map = [{ path: '/home', meta: { title: '首頁' }, component: '@/page/home' }, { path: '/question', meta: { title: '問題' }, component: '@/page/question' }] let map1 = Object.keys(obj).reduce((arr, item) => { return (arr.push({ path: item, ...obj[item] }), arr) }, []) console.log(map1)
轉化後效果數組
這個栗子來自vue配置路由時遇到的,當時也是優化了好幾個版本。函數
接下來詳細解釋一下優化
Object.keys(obj) //把obj轉化爲內容爲key的數組 reduce((arr,item)=>{ }) //上邊已經解釋過參數了,回調後邊的參數[]:返回值默認值是一個空數組 關於 return (arr.push({ path: item, ...obj[item] }), arr) 其實能夠寫成 arr.push({ path: item, ...obj[item] }) return arr
別急還有一個用法新鮮剛發現的。spa
//需求:判斷數組每一項的end和下一項的start是不是遞增的,返回ture or false let arr = [{ start: 1, end: 3 }, { start: 1, end: 3 }, { start: 4, end: 5 }] function isTure(arr) { let status = true arr.reduce((pro, next) => { if (pro.end >= next.start) { status = false return false } return next }) return status } console.log(isTure(arr))
這裏咱們巧用了 reduce的返回值,每次返回當前項,這樣兩個參數始終爲1,2 | 2,3|3,4依次類推code
[map]https://segmentfault.com/a/11...component
//新加獲取數組重複次數最多的字符 var arr = ["a", "s", "d", "f", "g", "r", "t", "h", "y", "t", "w", "w", "w", "w", "w", "r", "d", "s"] function getMaxLen(arr) { let str = '' let len = 0 arr.reduce((map, item) => { map[item] ? ++map[item] : map[item] = 1 if (map[item] > len) { len = map[item] str = item } return map }, {}) return { str, len } } console.log(getMaxLen(arr))//{str: "w", len: 5}
推薦我的專欄:https://segmentfault.com/blog...
您的吐槽or點贊是個人動力!