# 🏅 Day 42 - 商品篩選功能 - 進階 延續 Day 41 的內容,使用 [這個 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 行的函式 ## 回報流程 將答案寫在 CodePen 並複製 CodePen 連結貼至底下回報就算完成了喔! 解答位置請參考下圖(需打開程式碼的部分觀看) ![](https://i.imgur.com/vftL5i0.png) <!-- 解答: 請記得填入自己的 API 名稱 https://codepen.io/hexschool/pen/wvXJwLR?editors=1011 --> 回報區 --- | # | Discord | CodePen / 答案 | | --- | ----- | ----- | | 01 | 毛巾 | [CodePen](https://codepen.io/bqdcjboa-the-solid/pen/RNbbEaM) | | 02 | Tatsu | [CodePen](https://codepen.io/chindesu0207/pen/ZYzzVaW) | | 03 | tim | [CodePen](https://codepen.io/jskrtivy-the-animator/pen/raBBjEO?editors=0010) | | 04 | Sonia | [CodePen](https://codepen.io/YUJOU/pen/azobOWK?editors=1010) | | 05 | Ariel | [CodePen](https://codepen.io/ariel0510/pen/ogvNdEG?editors=1010) | | 06 | 陳小廷 | [CodePen](https://codepen.io/ting1124/pen/mybywdd) | | 07 | chris | [CodePen](https://codepen.io/chris-chen-the-selector/pen/yyByrLR) | | 08 | GTR150 | [CodePen](https://codepen.io/Wer-Qwe/pen/raBVNWv?editors=1011) | | 09 | Chun | [CodePen](https://codepen.io/Chun_debbie/pen/EaYVEBd) | | 10 | yuyuhunter_0509 | [CodePen](https://codepen.io/KRcube/pen/JoPXPZR?editors=1010) | <!-- 可複製下方格式 | | | [CodePen]() | -->