糾結許久,終於想不開,要來推坑自己寫第一篇JavaScript技術文。
初出茅廬總是有點尷尬,但又沒辦法跳過這個階段。
矽谷知名創投家雷德・霍夫曼(Reid Garrett Hoffman)曾說過:「如果你不為你產品的第一個版本感到尷尬,就表示你太晚發布了!」
既然剛開始總是要尷尬的,那就趕快上路,習慣這個尷尬吧,總是要開始才有進入迭代、更新、修正循環的機會。
學習一項技術最有效的方法就是實際動手操作,或是費曼方法:教別人。
而提到教別人,內心不免會產生:「我是什麼咖啊?憑什麼想教別人?」的忌憚。
但是我們又想利用費曼方法的效果,來加速自己的進步,那麼換個角度想:如果只是想留下一個筆記?也就是還沒掌握這項知識技術的自己?
從這個角度來看,心便放寬許多:不用想得太過複雜、太過宏大、太過嚴肅,這不過就只是個技術筆記罷了。
不需要是個咖,純粹只是想督促自己進步,幫助上一個版本的自己更新,或是不小心遺忘這項知識的自己(版本劣化?)
如果還能順手拉把在學code路上,在同樣的坑掙扎的同伴,那就太好了。
預防針打完,正文開始:
最近開始玩起codewars,一個提供邏輯挑戰題,讓你練習編寫code訓練邏輯思考的平台。
有一回我遇到一個練習題:請排序隨機給定的英文字母字串,其中有個網友解法讓我覺得有趣。
先來看看這位大大的做法:
function sortRandomString(str) {
const sortString = str => {
return "abcdefghijklmnopqrstuvwxyz"
.split("")
.filter((letter) => str.includes(letter))
.join("");
};
return sortString(str);
}
我覺得有趣的點在於,大部分的解法都是利用JavaScript內建的.sort()方法排序,而這位網友的方法,是先依序列出全部的英文字母後,再將這串字串轉換為陣列,最後使用array.filter()方法篩選,完成排序。
原來filter()還可以有這種用法,觀察別人的做法真的是個不錯的方式,不但可以看見自己的盲點,還可以發現不少奇思妙想。
因此我就想來筆記一下array的.filter()方法。
這個方法主要是用來篩選陣列中的元素,並將符合條件的元素回傳為一個新陣列。
遍歷一個陣列array,其中的元素是否符合給定的條件函式,是的話就留下,遍歷結束後,回傳留下的元素組成的新陣列。
想像一個生活化的例子:
假設有四種家庭:清寒、勉持、小康、富裕,分別有財產:1萬元、10萬元、500萬元、9000萬元。用陣列表示如下(為避免不必要干擾,去掉萬):
const property = [1, 10, 500, 9000]
假如社會福利機構要篩選出資產不足20萬的家庭補助,就可以利用filter():
const help = property.filter(p => p < 20)
console.log(help) // [1, 10]
這樣就可以篩選出哪些資產的家庭,符合補助的條件了。
只有篩選數字感覺有點乏味,那再來個生活化的例子試試,假設我們要去市場採買,首先利用建構式函式,快速建立出食材物件:
function Ingredients(name, type) {
this.name = name;
this.type = type;
}
const carrot = new Ingredients("carrot", "vegetable");
const tomato = new Ingredients("tomato", "vegetable");
const banana = new Ingredients("banana", "fruit");
const apple = new Ingredients("apple", "fruit");
接著建立購物清單的陣列:
const shoppingList = [carrot, tomato, apple, banana];
最後使用 array.filter 從購物清單中篩選出食材中的水果,由於會回傳新陣列,所以我們需要宣告一個變數來承接:
const fruitList = shoppingList
.filter((i) => {
return i.type === "fruit";
})
.map((f) => f.name);
console.log("水果清單:", fruitList); // 水果清單: ['apple', 'banana']
以上就是陣列的篩選方法,當需要從一筆資料中,抓出符合條件的特定資料時,.filter()就是常用的方法與思路,請務必多嘗試熟練一下。