---
# System prepended metadata

title: "\U0001F3C5 Day 33 - 商品篩選功能+進階"
tags: [JS 直播班 - 2025 秋季班]

---

# 🏅 Day 33 - 商品篩選功能+進階

問題一
---
請同學實作「商品篩選」的功能，點擊 select 會呈現相對應類型的商品，如下圖：
> 可以使用此 [CodePen 模板](https://codepen.io/hexschool/pen/dyKOmpg?editors=1011) 

![](https://i.imgur.com/VAHbfUy.png)


問題二
---
延續上一題的內容，使用 [這個 CodePen](https://codepen.io/hexschool/pen/zYaZOQB?editors=1010) 練習。請嘗試不要將 select 欄位寫死，而是使用 axios 取回的 products 資料，篩選出產品的 category 後再渲染至網頁上。

![](https://i.imgur.com/HRDjaot.png)

教學
---
該題目有稍微超出課程錄影的範圍，因此提供小教學讓大家做額外練習。
這個任務會用到 [filter() 函式](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) 與 [map() 函式](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Array/map)，再加上 [indexOf() ](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf) 的觀念，同學可以直接觀看解答再自己練習看看。

### indexOf() 介紹：
> 可以用 indexOf() 去尋找某個元素是否存在於陣列之中，會回傳陣列中第一個被找到的指定元素索引，若不存在於陣列中則回傳 -1。

```javascript=
const fruits = ['apple', 'banana', 'banana', 'orange'];
console.log(fruits.indexOf('banana')); // 結果為 1，會回傳第一個找到的 banana 元素之索引
console.log(fruits.indexOf('lemon')); // 結果為 -1，因為 lemon 不存在於陣列中
```

### 教學開始（請搭配 [解答](https://codepen.io/hexschool/pen/wvXJwLR?editors=1011) 觀看）
### 步驟一：透過 axios 取得 product 資料
> 範例是將 product 資料存放於 productData 變數（JS 第 12 行）

### 步驟二：取得所有產品的 category 名稱
> 透過 map() 針對 productData 做處理，return 取出所有產品的 category 名稱，並指派給 unSort 這個變數（JS 第 64 - 66 行）
```javascript=
let unSort = productData.map(function(item) {
    return item.category;
});
console.log(unSort); // 結果為 ["床架","床架","窗簾","床架","收納","床架","收納","床架"]
```
### 步驟三：移除重複的 category 名稱
> 透過 filter() 針對 unSort 做篩選，並指派給 sorted 這個變數（JS 第 69 - 72 行）
```javascript=
let sorted = unSort.filter(function(item, i){
    // 因為 indexOf() 只會回傳第一個找到的匹配元素之索引，搭配 filter() 做判斷就可以只保留不重複的元素
    return unSort.indexOf(item) === i;
})
console.log(sorted); // 結果為 ["床架","窗簾","收納"]
```

![](https://i.imgur.com/9HhIjvx.png)

### 步驟四：進行畫面渲染
> 參考 JS 第 76 - 82 行的函式


<!-- 解答：  

請記得填入自己的 API 名稱

問題一：
https://codepen.io/hexschool/pen/yLEVKXM?editors=1010

若不太清楚要怎麼做可看下方作業提示：

使用監聽事件選擇選單，
選單改變時觸發函式，
函式的部分為讀取選單的內容與 api 中的資料核對，
符合的資料則挑出來加入渲染。

問題二：
https://codepen.io/hexschool/pen/wvXJwLR?editors=1011
-->