JavaScript中reduce()詳解及使用方法
reduce():
reduce()方法為歸并類方法,最常用的場景就是,計(jì)算數(shù)組中的每一項(xiàng)的總和。
reduce() 方法會(huì)遍歷數(shù)組的每一項(xiàng),他接收兩個(gè)參數(shù):
第一個(gè)參數(shù):每次遍歷都會(huì)調(diào)用的函數(shù),而這個(gè)函數(shù)有接收四個(gè)參數(shù),分別是:前一個(gè)值、當(dāng)前項(xiàng)、項(xiàng)目的索引和數(shù)組對象,而這個(gè)函數(shù)的返回值,回傳給下一次遍歷時(shí),執(zhí)行的這個(gè)方法的第一個(gè)參數(shù)。
第二個(gè)參數(shù):歸并基礎(chǔ)的初始值
我們看一下例子: reduce()怎么用?
let arr = [1,2,3,4,5] arr.reduce((prev,cur)=>{ return prev+cur })
上面的這段代碼,是用來計(jì)算數(shù)組總和的,reduce()方法中,只傳了第一個(gè)參數(shù),也就是只傳了一個(gè)函數(shù),但第二個(gè)參數(shù)、初始值沒有傳,當(dāng)?shù)诙€(gè)值沒有傳的時(shí)候,第一次循環(huán),prev的值,默認(rèn)為數(shù)組的第一項(xiàng),而cur的值為數(shù)組的第二項(xiàng),也就是第一次循環(huán),會(huì)return 1+2,這個(gè)時(shí)候,第一次循環(huán)返回的結(jié)果回傳給下一次循環(huán)中方法的第一個(gè)參數(shù),也就是說、第二次循環(huán)方法中prev的值,是第一次循環(huán)方法返回的結(jié)果
let arr = [1,2,3,4,5] arr.reduce((prev,cur)=>{ return prev+cur },10)
我們傳入一下第二個(gè)參數(shù),第一個(gè)循環(huán),prev的值為reduce的第二個(gè)參數(shù),也就是"歸并基礎(chǔ)的初始值",而cur的值為數(shù)組的第一項(xiàng),第一項(xiàng)循環(huán)會(huì)返回10+1
總結(jié):
1.當(dāng)reduce()方法的第二個(gè)值為空時(shí),第一次循環(huán)方法中的第一個(gè)參數(shù)(prev)為數(shù)組的第一項(xiàng)值,第二個(gè)參數(shù)(cur)為數(shù)組的第二項(xiàng)值,反之,第一次循環(huán)方法中的第一個(gè)參數(shù)(prev)為reduce的第二個(gè)參數(shù)值,第二個(gè)參數(shù)(cur)為數(shù)值的第一項(xiàng)值。
2.reduce()方法的第一個(gè)參數(shù),就是每次遍歷都會(huì)執(zhí)行的匿名函數(shù),當(dāng)前函數(shù)的返回值就會(huì)傳給下一次執(zhí)行函數(shù)的第一個(gè)值。也就是prev
reduce 應(yīng)用場景:
1.數(shù)組里所有值的和
var arr = [0,1,2,3]; var value = arr.reduce((pre, cur) => { return pre + cur; }, 0); console.log(value);// 輸出:6
2.累加數(shù)組中對象的值
var arr = [{ x: 1 }, { x: 2 }, { x: 3 }]; var value = arr.reduce((pre, cur) => { return pre + cur.x; }, 0); console.log(value);// 輸出:6
3.將二維數(shù)組轉(zhuǎn)為一維數(shù)組
var arr = [ [0, 1], [2, 3], [4, 5], ]; var value = arr.reduce((pre, cur) => { return pre.concat(cur); }, []); console.log(value); // 輸出:[0, 1, 2, 3, 4, 5]
4.計(jì)算數(shù)組中每個(gè)元素出現(xiàn)的次數(shù)
var arr = ["a", "b", "a", "c", "c", "c"]; var value = arr.reduce((pre, cur) => { if (cur in pre) { pre[cur]++; } else { pre[cur] = 1; } return pre; }, {}); console.log(value); // 輸出:{a: 2, b: 1, c: 3}
5.按屬性對object分類
var people = [ { name: "tom", age: 17, birthYear: 2021 }, { name: "tony", age: 21, birthYear: 2021 }, { name: "bob", age: 18, birthYear: 2020 }, { name: "bob", age: 18, birthYear: 2021 }, { name: "bob", age: 18, birthYear: 2019 }, ]; function groupBy(arr, property) { if (!Array.isArray(arr)) return []; return arr.reduce((pre, obj) => { var newObj = { [property]: obj[property], data: [obj], }; if (!pre.length) { return [newObj]; } for (let i = 0; i < pre.length; i++) { let item = pre[i]; if (item[property] === obj[property]) { item.data = [...item.data, obj]; return pre; } } return [...pre, newObj]; }, []); } var value = groupBy(people, "birthYear");
返回值:
6.數(shù)組去重:
var arr = [1, 2, 3, 2, 2, 3, 5, null, null, 0, false, false, true]; var value = arr.reduce((pre, cur) => { return pre.includes(cur) ? pre : pre.concat(cur); }, []); console.log(value);//[1, 2, 3, 5, null, 0, false, true]
附:reduce的高級(jí)用法
(1)計(jì)算數(shù)組中每個(gè)元素出現(xiàn)的次數(shù) 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} (2)數(shù)組去重 let arr = [1,2,3,4,4,1] let newArr = arr.reduce((pre,cur)=>{ if(!pre.includes(cur)){ return pre.concat(cur) }else{ return pre } },[]) console.log(newArr);// [1, 2, 3, 4] (3)將二維數(shù)組轉(zhuǎn)化為一維 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] (3)將多維數(shù)組轉(zhuǎn)化為一維 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] (4)、對象里的屬性求和 var result = [ { subject: 'math', score: 10 }, { subject: 'chinese', score: 20 }, { subject: 'english', score: 30 } ]; var sum = result.reduce(function(prev, cur) { return cur.score + prev; }, 0); console.log(sum) //60
到此這篇關(guān)于JavaScript中reduce()詳解及使用方法的文章就介紹到這了,更多相關(guān)js中reduce()詳解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- JavaScript中reduce()方法的使用詳解
- js中的reduce()函數(shù)講解
- 詳解JavaScript中數(shù)組的reduce方法
- 詳解JS數(shù)組Reduce()方法詳解及高級(jí)技巧
- js數(shù)組方法reduce經(jīng)典用法代碼分享
- JS使用reduce()方法處理樹形結(jié)構(gòu)數(shù)據(jù)
- JavaScript中自帶的 reduce()方法使用示例詳解
- JavaScript中reduce()的5個(gè)基本用法示例
- JS數(shù)組方法reduce的妙用分享
- JavaScript中的reduce方法執(zhí)行過程、使用場景及進(jìn)階用法
相關(guān)文章
關(guān)于meta viewport中target-densitydpi屬性詳解(推薦)
這篇文章主要介紹了關(guān)于meta viewport中target-densitydpi屬性詳解,通過不同的縮放比例實(shí)現(xiàn)了不同的預(yù)覽效果,具體操作步驟大家可查看下文的詳細(xì)講解,感興趣的小伙伴們可以參考一下。2017-08-08Bootstrap 模態(tài)框(Modal)插件代碼解析
Bootstrap 模態(tài)框(Modal)插件 模態(tài)框(Modal)是覆蓋在父窗體上的子窗體。這篇文章主要介紹了Bootstrap 模態(tài)框(Modal)插件代碼解析的相關(guān)資料,需要的朋友可以參考下2016-12-12js從Cookies里面取值的簡單實(shí)現(xiàn)
遇到一個(gè)Js從Cookies里面取值的需求,Js貌似沒有現(xiàn)成的方法可以指定Key值獲取Cookie里面對應(yīng)的值,簡單實(shí)現(xiàn)如下2014-06-06vite添加環(huán)境變量import.meta.env的方法
在不同的文件里面配置不同的環(huán)境變量,可以讓我們的配置更加容易維護(hù)和使用,這里我們說下vite配置環(huán)境變量和模式是怎么配置的,對vite環(huán)境變量相關(guān)知識(shí)感興趣的朋友跟隨小編一起看看吧2023-10-10JavaScript實(shí)現(xiàn)點(diǎn)擊切換驗(yàn)證碼及校驗(yàn)
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)點(diǎn)擊切換驗(yàn)證碼及校驗(yàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01微信小程序?qū)崿F(xiàn)同時(shí)上傳多張圖片
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)同時(shí)上傳多張圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02