- 原文地址:JavaScript’s Filter Function Explained By Applying To College
- 原文作者:Kevin Kononenko
- 譯文出自:掘金翻譯計劃
- 本文永久連結:github.com/xitu/gold-m…
- 譯者: Calpa
- 校對者:linxuesia, rydensun
如果你熟悉申請大學流程的話,你也可以理解 JavaScript 的 filter 方法。
![[譯] 以申請大學流程來解釋 JavaScript 的 filter 方法](https://i.iter01.com/images/41e5b050b0aa45564df4546664f526ec4b4596bd68bf6cd9ca1a547e6b7d3e24.jpg)
相對於 JavaScript 裡面的 map() 和 reduce() 方法來說,filter() 方法也許是最一目瞭然的方法。
你輸入一個陣列,以特定方法過濾它們,並返回一個新的陣列。
這個看起來很簡單,不過我總是想把它換成 for() 迴圈。因此,我選擇一種更加好的方法去理解 filter() 是如何執行的。
我發現,filter 方法就類似大學入學審批官。它們用一堆的引數來決定哪些學生可以進入他們特定的學院。是的,我們希望學院都可以更加靈活,全面地考察我們過去的成就,不過在實際情況中,很多硬性數字指標例如 SAT、ACT 和 GPA 績點才是考量的決定因素。
就讓我們一起探討這個流程吧。
![[譯] 以申請大學流程來解釋 JavaScript 的 filter 方法](https://i.iter01.com/images/c3424070f55a8a7f1fcdd2451584dbed98cf80c9873fd8a5f3b39c2e350172d7.png)
使用 For 迴圈而不是 Filter 函式
好的,我們假設這裡有四個同學,並列出他們的名字和 GPA。有一個學院只想要擁有 3.2 GPA 以上的學生進入學院。下面是你可能的做法。
let students = [
{
name: "david",
GPA: 3.3
},
{
name: "sheila",
GPA: 3.1
},
{
name: "Alonzo",
GPA: 3.65
},
{
name: "Mary",
GPA: 3.8
}
]
let admitted =[];
for (let i=0; i < students.length; i++){
if(students[i].gpa > 3.2)
admitted.push(students[i]);
}
/*admitted = [
{
name: "david",
GPA: 3.3
},
{
name: "Alonzo",
GPA: 3.65
},
{
name: "Mary",
GPA: 3.8
}
];*/
複製程式碼
哇!這個是一個過於複雜的例子。如果有人閱讀你的程式碼,他們可能需要追蹤多個陣列,才意識到你的一個簡單過濾陣列方法。同時,你需要仔細地追蹤 i 來避免發生錯誤。就讓我們學習如何利用 filter 方法來達到相同效果吧。
使用 Filter() 方法
就讓我們使用 filter() 方法來達到相同效果吧。
- Filter 是一個陣列方法,所以我們會從學生陣列開始。
- 對於每一個陣列裡面的元素,它會呼叫一個回撥(callback)方法。
- 它用 return 來宣告哪些元素會出現在最終的陣列裡面,也就是被錄取的學生。
let students = [
{
name: "david",
GPA: 3.3
},
{
name: "sheila",
GPA: 3.1
},
{
name: "Alonzo",
GPA: 3.65
},
{
name: "Mary",
GPA: 3.8
}
]
let admitted = students.filter(function(student){
return student.gpa > 3.2;
})
/*admitted = [
{
name: "david",
GPA: 3.3
},
{
name: "Alonzo",
GPA: 3.65
},
{
name: "Mary",
GPA: 3.8
}
];*/
複製程式碼
輸入和輸出都是一樣的,這裡是我們做法不一樣的地方:
- 我們不需要定義一個 admitted 陣列,然後填充它。我們可以在同一個程式碼塊裡面同時定義,並填充它的元素。
- 我們實際上是在 return 語句中使用了一個條件判斷式!這代表我們只需要返回那些符合條件的元素。
- 我們現在可以用 student 而不是在 for 迴圈裡面的 student[i] 來迴圈每個陣列裡面的元素,
![[譯] 以申請大學流程來解釋 JavaScript 的 filter 方法](https://i.iter01.com/images/e2504d200fadce06ce16acb0d5aaf4e7ed87637deae8d7657867a2367ca250d5.jpg)
![[譯] 以申請大學流程來解釋 JavaScript 的 filter 方法](https://i.iter01.com/images/b885e0786093aa7c5f9a8397d10a28780a0f573d580b23015f862ce501df1f2a.jpg)
你可能注意到一件事,與直覺相反 — 我們只會在最後一步獲得錄取資格,不過在我們的程式碼裡面,變數 admitted 是首先出現在 statement 裡面!你可能會預期在這個函式的最後去尋找最終的陣列。取而代之,我們用返回來表示哪個元素會結束在 admitted。
![[譯] 以申請大學流程來解釋 JavaScript 的 filter 方法](https://i.iter01.com/images/50af280ad59e047c7f027e5a6e5e971cb08c031f938390f756bc0785c449bdbc.png)
例子 2 — 在 Filter 裡面用兩個條件判斷式
直至現在,在我們的 filter 方法內,我們只用了一個條件判斷式。不過這並不代表全部的大學入學流程!通常,入學審查官會觀察超過 10 個因素。
讓我們看一下這兩個因素 — GPA 和 SAT 分數。學生必須擁有 GPA 績點超過 3.2 及 SAT 分數超過 1900。下面是函式應該出現的樣子。
let students = [
{
name: "david",
GPA: 3.3,
SAT: 2000
},
{
name: "sheila",
GPA: 3.1,
SAT: 1600
},
{
name: "Alonzo",
GPA: 3.65,
SAT: 1700
},
{
name: "Mary",
GPA: 3.8,
SAT: 2100
}
]
let admitted = students.filter(function(student){
return student.gpa > 3.2 && student.SAT > 1900;
})
/*admitted = [
{
name: "david",
GPA: 3.3,
SAT: 2000
},
{
name: "Mary",
GPA: 3.8,
SAT: 2100
}
];*/
複製程式碼
看起來很像,對吧?現在我們有兩個條件判斷式在 return statement 裡面。讓我們把這段程式碼再拆分一下。
let admitted = students.filter(function(student){
let goodStudent = student.gpa > 3.2 && student.SAT > 1900
return goodStudent;
})
複製程式碼
啊!所以與 for 迴圈相比的話,這裡就是另外一個重要的差異處。如果你觀察一下 goodStudent 變數的話,就會發現它只會得出 true 或者是 false 值,然後,這個布林值被賦值給返回語句。
所以, true 或者 false 真的決定了,原始陣列裡面每個的元素是包含還是排除,然後放到結果的陣列, admitted。
![[譯] 以申請大學流程來解釋 JavaScript 的 filter 方法](https://i.iter01.com/images/53c19c8fcfd8829e833a9c0bf63d770bdb210f07b7f0bbdd74a88125a8cec2f6.jpg)
![[譯] 以申請大學流程來解釋 JavaScript 的 filter 方法](https://i.iter01.com/images/d80bd810d572183fd8883cb588f6340031fcc0634ec01d3c76907ecf9ae65c96.png)
如果發現譯文存在錯誤或其他需要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可獲得相應獎勵積分。文章開頭的 本文永久連結 即為本文在 GitHub 上的 MarkDown 連結。
掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 Android、iOS、前端、後端、區塊鏈、產品、設計、人工智慧 等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃、官方微博、知乎專欄。