# JavaScript 陣列處理方法 ###### tags: `JavaScript` `JS 直播班 - 2021 秋季班` ## <font color=#BB183D>陣列範例:</font> ```=JavaScript let data=[2,6,10,20,13]; ``` ## <font color=#BB183D> 1. forEach(): </font> 不會回傳值,只會執行陣列裡面的元素 ```=JavaScript data.forEach(function(item){ //參數:(currentValue , index , array) console.log(item); }) // 2 6 10 20 13 ``` ### <font color=#188DBB>參數:</font> 這個 callback 函式將會把 Array 中的每一個元素作為參數,帶進 callback 函式裡,每個元素各執行一次,接收三個參數: forEach中參數順序是固定的,但是自訂參數名稱 1. currentValue : 目前到達的陣列元素 2. index : 目前到達的陣列元素的索引 3. array : 目前被使用到的陣列 ## <font color=#BB183D>2. map():</font> 需要回傳一個值,並會用forEach回傳的值組合成一個陣列 參數跟forEach一樣 ```=JavaScript let newArr=data.map(function (item){ //參數:(currentValue , index , array) return item+=10; }) console.log(newArr); // 透過map將return的值放到newArr中產生新陣列 // 12 , 16 , 20 , 30 , 23 ``` ## <font color=#BB183D>3. filter():</font> 將陣列元素進行過濾,並回傳值放到新陣列~ ```=JavaScript let newbArray=data.filter(function(item){ //參數:(currentValue , index , array) return item>6; }) console.log(newbArray); //10,20,13 ``` ## <font color=#BB183D>4. reduce():</font> 將一個累加器及陣列中每項元素(由左至右)傳入回呼函式,將陣列化為單一值。 ```=JavaScript const array1 = [1, 2, 3, 4]; const reducer = (previousValue, currentValue) => previousValue + currentValue; // 1 + 2 + 3 + 4 console.log(array1.reduce(reducer)); //參數:(accumulator, currentValue , index , array) // expected output: 10 accumulator(此範例為reducer)是一個累加器 // 5 + 1 + 2 + 3 + 4 console.log(array1.reduce(reducer, 5)); // expected output: 15 ``` ## <font color=#BB183D>5. find():</font> 用來查找元素 , find() 只會回傳一次值,且是第一次為 true 的值。 ```=JavaScript const dataB=[5,1,10,5,23]; let cVar=dataB.find(function(item,index){ console.log(`目前索引:${index}`); //目前索引:0 return item === 5; }) console.log(cVar); // 5 ``` ## <font color=#BB183D>6. every():</font> 檢查所有的陣列是否符合條件,這僅會回傳一個值 true or false,可以用來檢查陣列中的內容是否符合特定條件 ```=JavaScript let ans=data.every(function(item){ return item<100; // 全部小於100才會true }) console.log(ans); // true let ans2=data.every(function(item){ return item<1; // 全部小於1才會true }) console.log(ans2); // false ``` ## <font color=#BB183D>7. some():</font> 跟every()很像,但every要全部都符合才會true,some只要部分符合就會true ```=JavaScript let ans=data.some(function(item){ return item<100; // 元素中有小於100就會true }) console.log(ans); // true let ans2=data.some(function(item){ return item<1; // 全部都不符合所以是false }) console.log(ans2); // false ``` ## <font color=#BB183D>8. 用indexOf 篩選出 不重複的陣列</font> #### 步驟二: 取得所有產品的 category 名稱 > 透過 map() 針對 productData 做處理,它可以只取出所有產品的 category 名稱,並指派給 unSort 這個變數 (JS 第 64 - 66 行) ```js= let unSort = productData.map(function(item) { return item.category; }); console.log(unSort); // 結果為 ["床架","床架","窗簾","床架","收納","床架","收納","床架"] ``` #### 步驟三: 移除重複的 category 名稱 > 透過 filter() 針對 unSort 做處理,並指派給 sorted 這個變數 (JS 第 69 - 72 行) ```js= let sorted = unSort.filter(function(item, i){ // 因為 indexOf() 只會回傳第一個找到的匹配元素之索引,搭配 filter() 做判斷就可以只保留不重複的元素 return unSort.indexOf(item) === i; }) console.log(sorted); // 結果為 ["床架","窗簾","收納"] ``` ![](https://i.imgur.com/9HhIjvx.png) ## 參考資料 [JavaScript 陣列處理方法 [filter(), find(), forEach(), map(), every(), some(), reduce()]](https://wcc723.github.io/javascript/2017/06/29/es6-native-array/) [Array.prototype.reduce()](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce) [陣列](https://eyesofkids.gitbooks.io/javascript-start-from-es6/content/part3/array.html)