自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

JS數(shù)組Reduce的妙用,收藏等于學(xué)會(huì)!

開(kāi)發(fā) 前端
說(shuō)到處理數(shù)組的方法,想必大家都不陌生了,今天我們一起來(lái)學(xué)習(xí)下理數(shù)組常見(jiàn)場(chǎng)景下的方法。

[[419162]]

本文轉(zhuǎn)載自微信公眾號(hào)「前端發(fā)現(xiàn)」,作者前端發(fā)現(xiàn)者。轉(zhuǎn)載本文請(qǐng)聯(lián)系前端發(fā)現(xiàn)公眾號(hào)。

說(shuō)到處理數(shù)組的方法,想必大家都不陌生了,今天我們一起來(lái)學(xué)習(xí)下理數(shù)組常見(jiàn)場(chǎng)景下的方法。

首先來(lái)看看 reduce 方法可以傳入哪些參數(shù)

  1. function(pre,cur,index,arr) 
  • pre:必需,初始值或計(jì)算結(jié)束后的返回值
  • cur:非必需,當(dāng)前處理的元素
  • index:非必需,當(dāng)前處理元素的索引
  • arr:非必需,當(dāng)前元素所屬的數(shù)組對(duì)象

直接看看

  1. const list = [1,2,3,4,5] 
  2. const result = list.reduce(function (pre, cur, index, arr) { 
  3.   console.log('pre:' + pre, 'cur:' + cur, 'index:' + index
  4.   return pre + cur 
  5. }) 
  6. console.log(result) 
  7.  
  8. // => pre:1 cur:2 index:1 
  9. // => pre:3 cur:3 index:2 
  10. // => pre:6 cur:4 index:3 
  11. // => pre:10 cur:5 index:4 
  12. // => 15 

可以看到,第一輪pre的值是數(shù)組的第一個(gè)值,然后當(dāng)前處理元素直接是元素的第二個(gè)數(shù)據(jù),索引是數(shù)組的1。第二輪的pre就是第一次邏輯處理 return pre + cur 返回的結(jié)果(即3)。以此類(lèi)推...共循環(huán)4輪。

再來(lái)看個(gè)相乘的處理邏輯的:

  1. const list = [1,2,3,4,5] 
  2. const result = list.reduce(function (pre, cur, index, arr) { 
  3.   console.log('pre:' + pre, 'cur:' + cur, 'index:' + index
  4.   return pre * cur 
  5. }) 
  6. console.log(result) 
  7.  
  8. // => pre:1 cur:2 index:1 
  9. // => pre:2 cur:3 index:2 
  10. // => pre:6 cur:4 index:3 
  11. // => pre:24 cur:5 index:4 
  12. // => 120 

看著這么復(fù)雜,能舉個(gè)再簡(jiǎn)單的例子嗎?別問(wèn),問(wèn)就是有!

  1. const result = list.reduce((pre, cur) => pre + cur) 
  2. console.log(result) // => 15 

簡(jiǎn)單后再來(lái)個(gè)高級(jí)點(diǎn)的嘗鮮下。

數(shù)組去重

將數(shù)組傳輸之前,我們先來(lái)了解下 reduce 的另外一個(gè),即 initialValue。它是代表傳遞給函數(shù)的初始值,「可以理解為給pre設(shè)置了默認(rèn)的值」。

  1. const list = [1,1,3,5,5,7,9] 
  2. let arr = list.reduce((pre,cur)=>{ 
  3.   if(!pre.includes(cur)){ 
  4.     return pre.concat(cur) 
  5.   }else
  6.     return pre 
  7.   } 
  8. },[]) // => 給pre設(shè)置默認(rèn)的空數(shù)組[] 
  9. console.log(arr) // => [1, 3, 5, 7, 9] 

可以看到list數(shù)組的長(zhǎng)度為7,共循環(huán)7次(設(shè)置默認(rèn)的空數(shù)組,導(dǎo)致cur第一輪是數(shù)組的第一個(gè)數(shù)據(jù))。每循環(huán)一次就判斷pre數(shù)組里存不存在當(dāng)前循環(huán)的元素,若不存在則加入到pre數(shù)組去,否則就直接退出當(dāng)前循環(huán)。

數(shù)組二維轉(zhuǎn)一維

  1. let arr = [1,2,[4, 6], [1, 6], [2, 2]] 
  2. let newArr = arr.reduce((pre,cur)=>{ 
  3.   return pre.concat(cur) 
  4. },[]) 
  5. console.log(newArr) // => [1, 2, 4, 6, 1, 6, 2, 2] 

這里其實(shí)也就是利用了數(shù)組的 concat 方法,跟上面的使用也是大同小異,理順一下就可以理解的了。

數(shù)組多維轉(zhuǎn)一維

  1. let arr = [1, 2, [4, 6], [1, 6, [3, 6]], [1, [3, 4, [1, 2]], [2, 2]]] 
  2. const newArr = (arr) => { 
  3.   return arr.reduce((pre, cur) => { 
  4.     return pre.concat(Array.isArray(cur) ? newArr(cur) : cur) 
  5.   }, []) 
  6. console.log(newArr(arr)) // => [1, 2, 4, 6, 1, 6, 3, 6, 1, 3, 4, 1, 2, 2, 2] 

這里使用了 三目運(yùn)算 、 concat 數(shù)據(jù)拼接 、遞歸 的思路完成。先判斷當(dāng)前處理的元素(有可能是數(shù)組)是不是數(shù)組(Array.isArray(cur)),如果是再次執(zhí)行newArr,否則就直接處理當(dāng)前元素,即將cur拼接進(jìn)之前處理的數(shù)組中。

計(jì)算元素出現(xiàn)個(gè)數(shù)

講解這個(gè)之前我們先來(lái)回憶下for...in的用法:

for...in 聲明用于對(duì)數(shù)組或者對(duì)象的屬性進(jìn)行循環(huán)/迭代操作。

直接上

  1. var arr = ['張三','李四','王五']     
  2. for (let x in arr)   
  3. {   
  4.   console.log(x) 
  5.   // => 張三 
  6.   // => 李四 
  7.   // => 王五 
  8. }   

可以看到當(dāng)arr為數(shù)組時(shí) x 相當(dāng)于 for 循環(huán)的?? 標(biāo)

那當(dāng)arr為對(duì)象呢?

  1. const obj = {   
  2.   name"張三",   
  3.   age: 18,   
  4.   height: "180"   
  5. }   
  6. for(let key in obj){   
  7.   console.log(key)  
  8.   // => name 
  9.   // => age 
  10.   // => height 
  11. }   

可以看到當(dāng)循環(huán)的“對(duì)象”是對(duì)象時(shí),循環(huán)的單項(xiàng)就是對(duì)象的屬性。

所以我們可以根據(jù)這個(gè)特性來(lái)判斷對(duì)象是否為數(shù)組/對(duì)象的元素/屬性。

  1. // 數(shù)組時(shí)判斷下標(biāo) 
  2. let arr = ["a","b","2","3"]  
  3. console.log("b" in arr) // => false 
  4. console.log(2 in arr) // => true 
  5.  
  6. // 對(duì)象時(shí)判斷屬性 
  7. let obj = {a:"a",b:"b",c:"2",d:"3"}  
  8. console.log("b" in obj) // => true 
  9. console.log(2 in obj) // => false 

好的,回憶完這些知識(shí),我們來(lái)看看怎么完成這個(gè)需求

  1. let names = ['張三''李四''張三''王五''王五''王五'
  2. let total = names.reduce((pre,cur)=>{ 
  3.   if(cur in pre){ 
  4.     pre[cur]++ 
  5.     console.log("判斷為真:"
  6.     console.log(pre) 
  7.   }else
  8.     pre[cur] = 1 
  9.     console.log("判斷為假:"
  10.     console.log(pre) 
  11.   } 
  12.   return pre 
  13. },{}) 
  14. console.log(total); // => {張三: 2, 李四: 1, 王五: 3} 

首先先傳入一個(gè){}對(duì)象,說(shuō)明初始的pre為{}。那么第一輪判斷if的時(shí)候就變成 '張三' in {} 很明顯此時(shí)判斷條件是 false 。所以就執(zhí)行 else 里面的邏輯后變成:{'張三':1}。第二輪時(shí) 李四 也是如此。當(dāng)?shù)谌啎r(shí)再次遇到“張三”,此時(shí)對(duì)象是 {'張三':1,'李四':1} ,所以if判斷是 true ,所以張三直接+1。來(lái)看看打印情況:

  1. 判斷為假: 
  2. // => {張三: 1} 
  3. 判斷為假: 
  4. // => {張三: 1, 李四: 1} 
  5. 判斷為真: 
  6. // => {張三: 2, 李四: 1} 
  7. 判斷為假: 
  8. // => {張三: 2, 李四: 1, 王五: 1} 
  9. 判斷為真: 
  10. // => {張三: 2, 李四: 1, 王五: 2} 
  11. 判斷為真: 
  12. // => {張三: 2, 李四: 1, 王五: 3} 

屬性求和

  1. const list = [ 
  2.   { 
  3.     name'張三'
  4.     age: 18 
  5.   }, 
  6.   { 
  7.     name'李四'
  8.     age: 20 
  9.   }, 
  10.   { 
  11.     name'王五'
  12.     age: 22 
  13.   } 
  14. let total = list.reduce((pre, cur) => { 
  15.   console.log(cur)  
  16.   // => {name'張三', age: 18} 
  17.   // => {name'李四', age: 20} 
  18.   // => {name'王五', age: 22} 
  19.   return cur.age + pre 
  20. }, 0) 
  21. console.log(total) // => 60 

如此是不是省了使用 map 去求和呢?更簡(jiǎn)便可以這么寫(xiě):

  1. let total = list.reduce((pre, cur) => cur.age + pre, 0) 

到此,今日的前端發(fā)現(xiàn)知識(shí)分享就到此結(jié)束了。

 

責(zé)任編輯:武曉燕 來(lái)源: 前端發(fā)現(xiàn)
相關(guān)推薦

2023-02-01 08:31:48

2025-04-23 08:55:00

函數(shù)編程JavaScript

2011-07-20 17:54:02

C++

2023-01-09 18:15:21

數(shù)組Python類(lèi)型

2021-09-29 06:03:37

JavaScriptreduce() 前端

2022-10-21 08:02:40

reduce?初始值循環(huán)

2024-04-07 08:15:13

Go語(yǔ)言工具

2021-03-22 06:28:44

reducemap函數(shù)

2023-05-08 08:11:55

KubernetesK8S

2009-10-19 11:26:08

Scala循環(huán)數(shù)組

2010-09-26 09:50:36

SQL Where子句

2023-11-27 19:35:01

C++extern

2010-09-08 16:26:26

SQL循環(huán)語(yǔ)句

2023-08-01 09:46:57

虛擬鍵盤(pán)API

2022-06-01 08:12:32

JS類(lèi)數(shù)組對(duì)象

2022-07-06 10:04:45

JavaScript數(shù)組前端

2020-02-13 18:05:18

數(shù)組reduce前端

2024-11-28 10:09:06

2021-03-05 07:45:59

JSreducemap

2019-11-11 21:24:42

HadoopHbase分布式
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)