關於 JavaScript 中的 reduce() 方法

来源:https://www.cnblogs.com/Leophen/archive/2020/03/16/12505792.html
-Advertisement-
Play Games

一、什麼是 reduce() ? reduce() 方法對數組中的每個元素執行一個升序執行的 reducer 函數,並將結果彙總為單個返回值 const array1 = [1, 2, 3, 4]; const reducer = (accumulator, currentValue) => acc ...


一、什麼是 reduce() ?

 

reduce() 方法對數組中的每個元素執行一個升序執行的 reducer 函數,並將結果彙總為單個返回值

const array1 = [1, 2, 3, 4];
const reducer = (accumulator, currentValue) => accumulator + currentValue;

// 1 + 2 + 3 + 4
console.log(array1.reduce(reducer));
// 輸出: 10

// 5 + 1 + 2 + 3 + 4
console.log(array1.reduce(reducer, 5));
// 輸出: 15

 

 

二、數組中 reduce 方法的參數

 

1、第一個參數:reducer 函數

其中,reducer 函數又有四個參數:

  1. Accumulator (acc) (累計器)
  2. Current Value (cur) (當前值)
  3. Current Index (idx) (當前索引)
  4. Source Array (src) (源數組)

 

2、第二個參數(可選):initialValue

代表傳遞給函數的初始值

// 不傳第二個參數的情況
var numbers = [1, 2, 3, 4]

function myFunction(item) {
    let result = numbers.reduce(function (total, currentValue, currentIndex, arr) {
        console.log(total, currentValue, currentIndex, arr)
        return total + currentValue
    })
    return result
}

myFunction(numbers)

輸出:

可以看到如果不傳第二個參數 initialValue,則函數的第一次執行會將數組中的第一個元素作為 total 參數返回。一共執行3次


下麵是傳遞第二個參數的情況:

// 不傳第二個參數的情況
var numbers = [1, 2, 3, 4]

function myFunction(item) {
    let result = numbers.reduce(function (total, currentValue, currentIndex, arr) {
        console.log(total, currentValue, currentIndex, arr)
        return total + currentValue
    }, 10)
    return result
}

myFunction(numbers)

輸出:

如果傳了第二個參數 initialValue,那麼第一次執行的時候 total 的值就是傳遞的參數值,然後再依次遍曆數組中的元素。執行4次

總結:如果不傳第二參數 initialValue,那麼相當於函數從數組第二個值開始,並且將第一個值最為第一次執行的返回值,如果傳了第二個參數 initialValue,那麼函數從數組的第一個值開始,並且將參數 initialValue 作為函數第一次執行的返回值

 

 

三、應用場景

 

1、數組裡所有值的和

var sum = [0, 1, 2, 3].reduce(function (accumulator, currentValue) {
  return accumulator + currentValue;
}, 0);
// 和為 6

 

2、累加對象數組裡的值

var initialValue = 0;
var sum = [{x: 1}, {x:2}, {x:3}].reduce(function (accumulator, currentValue) {
    return accumulator + currentValue.x;
},initialValue)

console.log(sum) // logs 6

 

3、將二維數組轉化為一維

var flattened = [[0, 1], [2, 3], [4, 5]].reduce(
  function(a, b) {
    return a.concat(b);
  },
  []
);
// flattened is [0, 1, 2, 3, 4, 5]

 

4、計算數組中每個元素出現的次數

var names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];

var countedNames = names.reduce(function (allNames, name) { 
  if (name in allNames) {
    allNames[name]++;
  }
  else {
    allNames[name] = 1;
  }
  return allNames;
}, {});
// countedNames is:
// { 'Alice': 2, 'Bob': 1, 'Tiff': 1, 'Bruce': 1 }

 

5、數組去重

var myArray = ['a', 'b', 'a', 'b', 'c', 'e', 'e', 'c', 'd', 'd', 'd', 'd'];
var myOrderedArray = myArray.reduce(function (accumulator, currentValue) {
  if (accumulator.indexOf(currentValue) === -1) {
    accumulator.push(currentValue);
  }
  return accumulator
}, [])

console.log(myOrderedArray);
let arr = [1,2,1,2,3,5,4,5,3,4,4,4,4];
let result = arr.sort().reduce((init, current) => {
    if(init.length === 0 || init[init.length-1] !== current) {
        init.push(current);
    }
    return init;
}, []);
console.log(result); //[1,2,3,4,5]

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 新聞/News 1. "谷歌Pixel 4a將採用UFS 2.1存儲:可以體驗全套GMS" 1. "[圖]Android端Play商城現全面開放深色主題" 教程/Tutorial 1. "OkHttp Interceptor Making the most of it" 1. "
  • 推薦一款非常好用的 Mac系統清理工具 ...
  • 最近在學習Android Studio時,回顧了一些Java源碼,發現有些源碼點開以後找不到對應的真正代碼,如HashMap中的TreeNode是繼承自LinkedHashMap.LinkedHashMapEntry,但顯示找不見LinkedHashMapEntry這個靜態內部類,而且LinkedH ...
  • Flutter中json轉換model, 除了手動轉之外, 就是利用第三方庫做一些代碼生成. 流行的庫有: [json_serializable](https://pub.dev/packages/json_serializable)和[built_value](https://pub.dev/p... ...
  • javascript中innerHTML 屬性用於獲取或替換 HTML 元素的內容,語法為Object.innerHTML 其中1.Object是獲取的元素對象,如通過document.getElementById("ID")獲取的元素;2.註意書寫,innerHTML區分大小寫。比方說通過id獲取... ...
  • 網頁由標簽將信息組織起來,而標簽的id屬性值是唯一的,如何通過javascript找到要獲取的元素,語法:document.getElementById("id"),運行結果值為null或[object HTMLParagraphElement],原因在於獲取的元素是一個對象,如想對元素進行操作,我... ...
  • [toc] js精準計算 0.1 + 0.2 = 0.30000000000000004。 計算精度誤差問題(和二進位相關)。 對於浮點數的四則運算,幾乎所有的編程語言都會有類似精度誤差的問題,只不過在 C++/C /Java 這些語言中已經封裝好了方法來避免精度的問題,而 JavaScript 是 ...
  • 一、HTML基礎語法 1.什麼是HTML HTML(Hypertext Markup language)超文本標記語言 2.HTML發展史 HTML1.0(1993IETF)→HTML2.0(1995W3C)→HTML3.2(1996W3C)→HTML4.0(1997W3C)→HTML4.0.1(1 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...