JS技術筆記array.filter()

by 江森

糾結許久,終於想不開,要來推坑自己寫第一篇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()就是常用的方法與思路,請務必多嘗試熟練一下。

You may also like

Leave a Comment