# 陣列操作(forEach、map、 filter、find、findIndex) ###### tags:`JavaScript 必修篇 - 前端修練全攻略` [[筆記] 六角學院:JavaScript 陣列處理方法](https://www.hexschool.com/2017/09/01/2017-09-01-javascript-for/) # forEach 一筆一筆讀取物件資料 會一筆一筆把資料取出來,再用 function 的方式執行 - 參數一(item):資料內容 - 參數二(index):第幾筆 - 參數三(array):陣列資訊 ### 陣列數字累加與變數作用域 ```javascript= let data = [30, 40, 100]; let total = 0; data.forEach(function(item,index){total += item}); console.log(total) ``` ### 搭配 if,篩選出陣列裡面有幾個偶數 ```javascript= let data = [30, 40, 100, 333, 4429]; let totalEven = 0; // 計算有多少偶數 let newData = []; // 計算偶數的陣列 data.forEach(function(item,index){ console.log(item); if( item%2 == 0){ totalEven += 1; newData.push(item); // 將都是偶數的item放到newData陣列 } }) console.log(newData); // [30,40,100] console.log(totalEven); // 3 ``` ##### 男女人數計算機-透過物件整合資料 ```javascript= let data = [ { name:"Tom", sex:"male" }, { name:"Mary", sex:"woman" }, { name:"Jane", sex:"woman" }, { name:"Jenny", sex:"woman" }, { name:"Joan", sex:"woman" } ]; // let momenNum = 0; // let manNum = 0; let people = { male:0, woman:0 } data.forEach(function(item, index){ if(item.sex == "woman"){ people.woman+=1; } else{ people.male+=1; } }); // console.log(`女生有${people.woman}個,男生有${people.male}個`) console.log(people); ``` 線上 OPEN DATA 電動充電站網址:[JSON 網址](https://data.kcg.gov.tw/user/login?came_from=https%3A%2F%2Fdata.kcg.gov.tw%2Fdataset%2Fa98754a3-3446-4c9a-abfc-58dc49f2158c%2Fresource%2F48d4dfc4-a4b2-44a5-bdec-70f9558cd25d%2Fdownload%2Fyopendata1070622opendatajson-1070622.json) ##### 高雄 OPEN DATA-陣列物件處理 ```javascript= let data = [{"Name":"bobo","Charge":"投幣式"},{"Name":"coco","Charge":"免費"}] let total = { free:[], paid:[] } data.forEach(function(item,index){ if(item.Charge=="免費"){ total.free.push(item); } else if(item.Charge=="投幣式"){ total.paid.push(item); } }) console.log(total) // {free:[{},{}], paid:[{}]} ``` ## forEach 題型練習 如何整合 innerHTML 資料、搭配網頁初始化狀態、免費與投幣式事件監聽設計、事件監聽搭配 if 流程判斷、DOM 拉出全域變數進行管理、篩選條件增加流程、新增充電站 UI 介面邏輯新增 > 本章節 Codepen 範例程式碼網址:[範例](https://codepen.io/hexschool/pen/oNYPPPx?editors=1010) ```htmlembedded= <h2>新增資料</h2> <input type="text" placeholder="充電站名稱" class="stationName"> <select class="stationCharge"> <option value="免費">免費</option> <option value="投幣式">投幣式</option> </select> <input type="button" class="btn" value="儲存"> <h2>資料顯示</h2> <div class="filter"> <input type="button" value="全部"> <input type="button" value="免費"> <input type="button" value="投幣式"> </div> <ul class="list"> </ul> ``` ```javascript= let data = [ { Charge:"免費", name:"小美充電站" }, { Charge:"投幣式", name:"小花充電站" }, { Charge:"投幣式", name:"阿天充電站" }, { Charge:"免費", name:"求求充電站" }, ]; // 搭配網頁初始化狀態 // 適用在從伺服器抓到資料時 先讓各項先顯示在螢幕上 const list = document.querySelector(".list"); // 預設載入函示 function init(){ let str = ""; data.forEach(function(item,index){ let content = `<li>${item.name},${item.Charge}</li>`; str +=content }) list.innerHTML = str; } init(); // 篩選器邏輯 const stationFilter = document.querySelector(".filter") stationFilter.addEventListener("click",function(e){ // 事件監聽搭配 if 流程判斷 if(e.target.value == undefined){ console.log("你點擊到空的地方"); return;//強制終端程式碼 } let str =""; data.forEach(function(item,index){ if(e.target.value=="全部"){ str+=`<li>${item.name},${item.Charge}</li>` }else if(e.target.value==item.Charge){ str+=`<li>${item.name},${item.Charge}</li>` } }) list.innerHTML = str; }) // 新增邏輯 const stationName = document.querySelector(".stationName"); const stationCharge = document.querySelector(".stationCharge"); const btn = document.querySelector(".btn"); btn.addEventListener("click", function(e){ let obj = {}; obj.Charge = stationCharge.value; obj.name = stationName.value; data.push(obj); init(); stationCharge.value = "免費"; stationName.value = ""; }) ``` # map 陣列操作 1. 能將原始陣列運算後,重新組合回傳一個新組合回傳一個新陣列。 2. 不會影響到原陣列。 3. 一定要return值,沒有的話會顯示undefined ```javascript= const arr = [1,5,10]; const newArr = arr.map(function(item){ return item*item; }) console.log(newArr) // 顯示新陣列 [1,25,100] // 但 arr一樣維持[1,5,10] ``` ```javascript= const data = [1,8,13,20]; const newData = data.map(function(item){ let obj ={}; obj.chechNum = item>10; return obj; }) console.log(newData); // 顯示陣列物件 ``` > forEach 適合用在: 1. 想把陣列都跑一遍 2. 想塞新東西 3. 想對特定index做處理 4. forEach 不會回傳新陣列 > map 適合用在: 1. 組好新變數,回傳新陣列 # filter 資料篩選 1. 篩選出符合條件的內容,組合後回傳新陣列。 2. 不會影響到原陣列。 3. 適合用在比價、下拉選擇市區、有誰及格.. ```javascript= const data = [1,8,13,20]; const newData = data.filter(function(item){ return item>=10; }) console.log(newData); ``` ```javascript= const scoreData = [{ name:"小明", score: 88 }, { name:"小英", score: 62 }, { name:"小花", score: 53 } ] const filterScore = scoreData.filter(function(item){ return item.score >= 60; }) ``` # find 尋找第一筆吻合資料 因為只有一筆,回傳的不是陣列,是物件 ```javascript= const data = [1,3,5,8,13,20]; const newData = data.find(function(item){ return item>=10; }) console.log(newData); // 顯示第一筆:13 ``` # findIndex 尋找資料索引 ```javascript= const colors = ["red","blue","black"]; const blueIndex = colors.findIndex(function(item){ return item=="blue"; }) console.log(blueIndex) // 顯示 1(index) ``` ```javascript= // 查詢訂單編號在哪一筆 const orders = [ { name: "小廖", orderId: "12332421" }, { name: "小華", orderId: "12332490" }, { name: "小美", orderId: "12332486" } ]; const huaID = orders.findIndex(function(item){ return item.orderId == "12332490"; }) console.log(`這個訂單編號是${orders[huaID].name}的`) // 顯示"這個訂單編號是小華的" ```