<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          6個(gè)關(guān)于Reduce() 應(yīng)用場(chǎng)景的用例

          共 3864字,需瀏覽 8分鐘

           ·

          2021-09-23 14:40


          英文 | https://betterprogramming.pub/6-use-cases-for-reduce-in-javascript-49683842ebed

          翻譯 | 楊小二


          reduce 方法在數(shù)組的每個(gè)元素上執(zhí)行用戶提供的回調(diào)函數(shù),即“reducer”。它傳入對(duì)前一個(gè)元素進(jìn)行計(jì)算的返回值。結(jié)果是單個(gè)值。它是在數(shù)組的所有元素上運(yùn)行 reducer 的結(jié)果。
          它是如何工作的?
          reducer 函數(shù)逐個(gè)遍歷數(shù)組元素。在每一步中,reducer 函數(shù)將當(dāng)前數(shù)組值添加到上一步的結(jié)果中,直到?jīng)]有更多元素要添加。
          參數(shù)是什么?
          參數(shù)是回調(diào)函數(shù)和可選的初始值。
          回調(diào)函數(shù)
          preVal:它是前一個(gè)回調(diào)函數(shù)產(chǎn)生的前一個(gè)值。
          currVal:它是數(shù)組的當(dāng)前元素,reducer 函數(shù)會(huì)傳播它。
          currentIndex:當(dāng)前索引。但是,它是可選的。
          arrayToTraverse:要遍歷的數(shù)組。它也是可選的。
          初始值
          初始值參數(shù)是可選的。它是第一次調(diào)用回調(diào)時(shí),將前一個(gè)值初始化的值。如果未指定初始值,則將前一個(gè)值初始化為初始值,將當(dāng)前值初始化為數(shù)組中的第二個(gè)值。
          在某些情況下,Reduce 方法是一種有價(jià)值的方法。在某些情況下,它可能會(huì)節(jié)省你的時(shí)間或減少你程序行數(shù)。在本文中,我將向你展示 JavaScript 中 reduce() 方法的6個(gè)用例。
          1、對(duì)數(shù)組元素求和
          假設(shè)你有以下數(shù)組:
          const prices = [5.99, 2.99, 3.99, 11.59]

          你可能更喜歡使用 for 循環(huán)或 for-each 循環(huán)來(lái)對(duì)上述數(shù)組的元素求和,但是,如果使用 reduce(),則可以編寫更少的代碼。

          正如你從介紹中知道的那樣,reduce() 接受一個(gè)帶有4個(gè)參數(shù)的函數(shù),preVal、currVal、currentIndex、prices,在這種情況下,

          你需要傳遞給 reduce 的第二個(gè)參數(shù),是你想要啟動(dòng)的初始值。例如,如果你希望對(duì)數(shù)組的元素求和,可以將 0 作為初始值。

          const sum = prices.reduce((preVal, currVal, currentIndex, prices) => {  return preVal + currVal;}, 0);

          reduce() 對(duì)數(shù)組中的每個(gè)元素執(zhí)行這個(gè)函數(shù)。第一次執(zhí)行的 preVal 是你設(shè)置為第二個(gè)參數(shù)的初始值,在本例中為“0”。否則,它將是未定義的。currVal 是數(shù)組的第一個(gè)元素。對(duì)于第二次執(zhí)行,對(duì)數(shù)組中的第二個(gè)元素執(zhí)行以下函數(shù):

          (preVal, currVal, currentIndex, prices) => {  return preVal + currVal;}

          現(xiàn)在,preVal 不是 0。它等于前一次執(zhí)行中返回的值。所以,preVal = 5.99 + 0。現(xiàn)在,currVal 是第二次迭代的第二個(gè)元素。

          在這種情況下,你不需要 currentIndex 和prices。因此,你可以將該函數(shù)編寫為單行函數(shù)。

          const sum = prices.reduce((preVal, currVal) => preVal + currVal, 0);

          2、展平數(shù)組

          使用reduce(),你可以將多維數(shù)組轉(zhuǎn)換為一維數(shù)組。

          var rows = [[2, 3, 5], [1, 2, 4], [8, 5, 5]]var matrixElements = rows.reduce( function (prev, current) {  return prev.concat(current);});

          3、創(chuàng)建管道

          此外,你可以減少函數(shù)以及數(shù)字和字符串。假設(shè)你有一系列數(shù)學(xué)函數(shù)。例如,你有以下功能:

          function increment(input) { return input + 1;}function decrement(input) { return input - 1; }function double(input) { return input * 2; }function halve(input) { return input / 2; }

          此外,你希望對(duì)訂單使用 increment、double 和 decrement。因此,你可以創(chuàng)建管道。然后,你可以將它與 reduce() 一起使用。

          let pipeline = [increment, double, decrement];
          const result = pipeline.reduce(function(total, func) { return func(total);}, 8);
          // result: 17

          4、 從數(shù)組中獲取對(duì)象

          例如,你有一個(gè)字符串?dāng)?shù)組,它們是彩色蘋果。使用 reduce() 你可以構(gòu)造一個(gè)蘋果對(duì)象,如下所示。

          const apples = ['green''red''red''yellow''red''yellow''green''green'];var appleMap = apples.reduce((prev, apple) => {  if (prev[apple] >= 1) prev[apple]++;  else prev[apple] = 1;  return prev;}, {});
          console.log(appleMap);// result: {green: 3, red: 3, yellow: 2}

          5、找出出現(xiàn)奇數(shù)次的整數(shù)

          你可以使用 reduce() 來(lái)查找在給定數(shù)組中出現(xiàn)奇數(shù)次的整數(shù)。下面的函數(shù)有一個(gè)不好的地方。如果你給出多個(gè)出現(xiàn)奇數(shù)次的整數(shù),它將不起作用。

          const findOdd = (a) => a.reduce((a, b) => a ^ b);console.log(findOdd([1, 2, 2, 1])); // Result: 0console.log(findOdd([1, 2, 2, 1, 2, 3, 3])); // Result: 2console.log(findOdd([1, 2, 3, 4])); // Result: 4 -> Not working

          6、求給定數(shù)組的最大子數(shù)組和

          使用此函數(shù),你可以找到給定數(shù)組的最大子數(shù)組和。這是一個(gè)需要解決的大問(wèn)題。解決起來(lái)并不容易。尤其是想用單線方案來(lái)實(shí)現(xiàn)這個(gè)功能,就更具挑戰(zhàn)性了。但是,如果使用reduce() 會(huì)更容易。

          const maxSequence = (a,sum=0) => a.reduce((max,v) => Math.max(sum = Math.max(sum + v, 0), max), 0);console.log(maxSequence([1,2,3,4])); // Result: 10console.log(maxSequence([1,2,3,4,-8])); // Result: 10console.log(maxSequence([1,-2,3,-2,5,-1,3,-9,1,6])); // Result: 8

          加餐:reduceRight()

          你也可以使用reduceRight()。它的工作方式與reduce() 相同。但是,它的工作方向相反。當(dāng)你學(xué)習(xí)時(shí),reduce() 從第一個(gè)元素開(kāi)始并朝最后一個(gè)元素移動(dòng)。相反,reduceRight() 從最后一個(gè)元素開(kāi)始,然后轉(zhuǎn)到第一個(gè)元素。

          const prices = [5.99, 2.99, 3.99, 11.59];
          let sum = prices.reduceRight(function (preVal, currVal) { console.log('prev: ', preVal, 'curr: ', currVal); return prev + curr;});console.log(sum);
          // prev: 11.59 curr: 3.99// prev: 15.58 curr: 2.99// prev: 18.57 curr: 5.99// 24.560000000000002

          結(jié)論

          了解 JavaScript 中一些內(nèi)置函數(shù)的用例可以幫助你提高編碼技能。學(xué)習(xí)用例可以為你提供一些見(jiàn)解,你可以優(yōu)雅地實(shí)現(xiàn)一些功能。

          JavaScript 中的 reduce() 也是一個(gè)有用的內(nèi)置函數(shù)。如果你知道如何使用它,它是強(qiáng)大的。它可以幫助你編寫較少數(shù)量的代碼行,如匯總價(jià)格的示例。

          綜上所述,本文reduce()的用例如下:

          • 對(duì)數(shù)組元素求和

          • 展平數(shù)組

          • 創(chuàng)建管道

          • 從數(shù)組中獲取對(duì)象

          • 找出出現(xiàn)奇數(shù)次的整數(shù)

          • 查找給定數(shù)組的最大子數(shù)組和。

          感謝你的時(shí)間,希望這篇文章內(nèi)容對(duì)你有所幫助,如果你覺(jué)它有用,也請(qǐng)你分享給你身邊做開(kāi)發(fā)的朋友。
          謝謝你的閱讀,祝編程愉快!


          學(xué)習(xí)更多技能

          請(qǐng)點(diǎn)擊下方公眾號(hào)

          瀏覽 32
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  男人天堂一区二区 | 亚洲操逼操| 精品 码红桃二区三区 | 99精品全国免费观看 | 免费一级a|