首頁 > web前端 > js教程 > 主體

透過範例來了解JS reduce()方法的5個使用方法

青灯夜游
發布: 2021-01-27 19:16:42
轉載
1961 人瀏覽過

透過範例來了解JS reduce()方法的5個使用方法

reduce()方法對陣列中的每一個元素執行一個reducer函數(由你提供),從而得到一個單一的輸出值。

reduce() 方法將一個陣列中的所有元素還原成單一的輸出值,輸出值可以是數字、物件或字串。 reduce() 方法有兩個參數,第一個是回呼函數,第二個是初始值

回呼函數

回呼函數在陣列的每個元素上執行。回調函數的傳回值是累加結果,並作為下一次呼叫回調函數的參數提供。回調函數帶有四個參數。

  • Accumulator(累加器)-累加器累加回呼函數的回傳值。
  • Current Value(目前值)-處理陣列的目前元素。
  • Current Index(目前索引)-處理陣列目前元素的索引。
  • Source Array(來源陣列)

#Current Index Source Array 是可選的。

初始值

如果指定了初始值,則將累加器設為 initialValue 作為初始元素。否則,將累加器設定為陣列的第一個元素作為初始元素。

arr.reduce(callback(accumulator, currentValue[,index[,array]])[, initialValue])
登入後複製

在下面的程式碼片段中,第一個累加器(accumulator)被指派了初始值0。 currentValue 是正在處理的 numbersArr 陣列的元素。在這裡,currentValue 被加入到累加器,下次呼叫回調函數時,會將回傳值作為參數提供。

const numbersArr = [67, 90, 100, 37, 60];
 
const total = numbersArr.reduce(function(accumulator, currentValue){
    console.log("accumulator is " + accumulator + " current value is " + currentValue);
    return accumulator + currentValue;
}, 0);
 
console.log("total : "+ total);
登入後複製

輸出

accumulator is 0 current value is 67
accumulator is 67 current value is 90
accumulator is 157 current value is 100
accumulator is 257 current value is 37
accumulator is 294 current value is 60
total : 354
登入後複製

JavaScript reduce用例

#1.對陣列的所有值求和

在下面的程式碼中,studentResult 陣列有5個數字。使用 reduce() 方法,將陣列減少為單一值,將 studentResult 陣列的所有值和結果指派給 total

const studentResult = [67, 90, 100, 37, 60];
 
const total = studentResult.reduce((accumulator, currentValue) => accumulator +currentValue, 0);
 
console.log(total); // 354
登入後複製

2.物件數組中的數值總和

通常,我們從後端取得資料作為物件數組,因此,reduce() 方法有助於管理我們的前端邏輯。在下面的程式碼中,studentResult 物件陣列有三個科目,這裡,currentValue.marks 取了 studentResult 物件陣列中每個科目的分數。

const studentResult = [
  { subject: '数学', marks: 78 },
  { subject: '物理', marks: 80 },
  { subject: '化学', marks: 93 }
];
 
const total = studentResult.reduce((accumulator, currentValue) => accumulator + currentValue.marks, 0);
 
console.log(total); // 251
登入後複製

3.展平數組

「展平數組」是指將多維數組轉換為一維。在下面的程式碼中,twoDArr 2維陣列被轉換為 oneDArr 一維陣列。此處,第一個 [1,2] 陣列分配給累加器 accumulator,然後 twoDArr 陣列的其餘每個元素都連接到累加器。

const twoDArr = [ [1,2], [3,4], [5,6], [7,8] , [9,10] ];
 
const oneDArr = twoDArr.reduce((accumulator, currentValue) => accumulator.concat(currentValue));
 
console.log(oneDArr);
// [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
登入後複製

4.依屬性分組物件

根據物件的屬性,我們可以使用 reduce() 方法將物件陣列分成幾組。透過下面的程式碼片段,你可以清楚地理解這個概念。這裡,result 物件陣列有五個對象,每個物件都有 subjectmarks 屬性。如果分數大於或等於50,則主題通過,否則,主題失敗。

reduce() 用於將結果分組為通過和失敗。首先,將initialValue 指派給累加器,然後push() 方法在檢查條件之後將目前物件新增至passfail#屬性中作為物件數組。

const result = [
  {subject: '物理', marks: 41},
  {subject: '化学', marks: 59},
  {subject: '高等数学', marks: 36},
  {subject: '应用数学', marks: 90},
  {subject: '英语', marks: 64},
];
 
let initialValue = {
  pass: [], 
  fail: []
}
 
const groupedResult = result.reduce((accumulator, current) => {
  (current.marks >= 50) ? accumulator.pass.push(current) : accumulator.fail.push(current);
  return accumulator;
}, initialValue);
 
console.log(groupedResult);
登入後複製

輸出

{
 pass: [
  { subject: ‘化学’, marks: 59 },
  { subject: ‘应用数学’, marks: 90 },
  { subject: ‘英语’, marks: 64 }
 ],
 fail: [
  { subject: ‘物理’, marks: 41 },
  { subject: ‘高等数学’, marks: 36 }
 ]
}
登入後複製

5.刪除陣列中的重複項目

在下面的程式碼片段中,刪除了plicatedArr 陣列中的重複項。首先,將一個空數組指派給累加器作為初始值。 accumulator.includes() 檢查 duplicatedArr 陣列的每個元素是否已經在累加器中可用。如果 currentValue 在累加器中不可用,則使用 push() 將其新增。

const duplicatedsArr = [1, 5, 6, 5, 7, 1, 6, 8, 9, 7];
 
const removeDuplicatedArr = duplicatedsArr.reduce((accumulator, currentValue) => {
  if(!accumulator.includes(currentValue)){
    accumulator.push(currentValue);
  }
  return accumulator;
}, []);
 
console.log(removeDuplicatedArr);
// [ 1, 5, 6, 7, 8, 9 ]
登入後複製

總結

在本文中,我們討論了陣列 reduce() 方法。首先介紹 reduce() 方法,然後,使用一個簡單的範例討論其行為。最後,透過範例討論了 reduce() 方法最常見的五個用例。如果你是JavaScript的初學者,那麼這篇文章將對你有幫助。

英文原文網址:https://medium.com/javascript-in-plain-english/5-use-cases-for-reduce-in-javascript-61ed243b8fef

作者:wathsala danthasinghe

更多程式相關知識,請造訪:程式設計影片! !

以上是透過範例來了解JS reduce()方法的5個使用方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:segmentfault.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!