# JS 筆記 -常用的陣列方法
![Array](https://ithelp.ithome.com.tw/upload/images/20190905/201064264EEnIVs0ur.jpg)
雖然不完全是 ES6 語法糖,但在比較舊的瀏覽器就無法支援這些語法,所以使用上要注意,透過下方幾個語法,可以精簡的處理陣列資料的程式碼。
## 範例資料
本次皆使用下方陣列資料 (除了 `sort()` 以外):
```javascript
const arr = [
{
name: 'Abby',
money: 5000
},
{
name: 'Ben',
money: 6500
},
{
name: 'Cathy',
money: 7500
},
{
name: 'Danny',
money: 8000
},
]
```
## forEach & map
這兩個語法大概有 87% 像,但又有點不同,這兩個語法都跟 for 迴圈的功能類似,原生語法要取得陣列資料會這樣寫:
```javascript
// 資料長度
let arrLen = arr.length;
console.log(arrLen); //4
//for
for (let i = 0; i < arrLen; i++) {
console.log(arr[i]);
}
```
### forEach
使用 forEach 更精簡的寫法,方式是在資料名稱後方加入 forEach 語法,後面接一個 function,參數分別帶入。
```javascript
arr.forEach(function (item, index, array) {
console.log(item, index, array);
})
```
* item: 代表陣列資料的內容,這邊陣列資料中的資料為物件。
* index: 索引位置,從 0 開始。
* array: 代表陣列資料本身(基本上沒有使用)。
若在 item 增加一個 icash 資料新增金額,可以這樣寫:
```javascript
arr.forEach(function (item, index, array) {
item.icash = item.money + 500;
console.log(item, index, array); //money 會得到 5500, 7000, 8000, 8500。
})
```
> forEach 本身不會回傳。
### map
承上,把 forEach 換成 map,得到的結果也會相同。
```javascript
arr.map(function (item, index, array) {
item.icash = item.money + 500;
console.log(item, index, array); //money 會得到 5500, 7000, 8000, 8500。
})
```
如果要使用 map 回傳一個新的陣列資料可以這樣寫:
```javascript
const newArr = arr.map(function (item, index, array) {
return {
...item, //拆解 item 資料,新增一個變數為newArr,併重新回傳資料到新變數中。
icach: item.money + 500 //分別在 ...item 中增加 icash 這個屬性與內容。
}
});
console.log(newArr); //會得到四個物件。
```
newArr 跟 arr 會是兩個不同的陣列資料。
> * map 本身會回傳,類似於 return 的功能。
> * 一般使用回傳的特性,會拿來做篩選,但 map 若沒有使用 return 語法,會回傳 undefined,所以 map 不適合拿來做篩選的功能。
## filter & find
### filter
filter 寫法跟上方一樣,return 的值也很單純,只有 true 或 false,
```javascript
const filterArr = arr.filter(function (item, index) {
return true;
});
console.log(filterArr); //true 得到四個物件資料,false 得到一個空陣列。
```
若今天要篩選 money 小於 6000 的方法可以這樣寫:
```javascript
const filterArr = arr.filter(function (item, index) {
if (item.money < 7000)
return true;
});
console.log(filterArr); // 得到 Abby 跟 Ben
```
> filter 會篩選所有相符的條件並做回傳,回傳的資料會是一個陣列。
### find
find 跟 filter 有點像,
```javascript
const findArr = arr.find(function (item, index) {
if (item.money < 7000)
return true;
});
console.log(findArr); // 找到 Abby 一筆資料就停止
```
> find 找到相符的一筆資料後就會停止,只會回傳一次,回傳的資料會依照 item 的內容照實回傳,EX. 是字串就回傳字串,比較適合用來找 id 或是指定的元素。
## every & some
這兩種語法基本上一樣,都是回傳布林值,差別如下:
* every 需所有條件相符才會回傳 true,有一條件不符就會回傳 false。
* some 只要有部分條件相符就會回傳 true。
程式碼如下:
### every
```javascript
const newArr = arr.every(function (item, index) {
return item.money > 1000
})
console.log(newArr); //true
```
### some
```javascript
const newArr = arr.some(function (item, index) {
return item.money > 6000
})
console.log(newArr);
```
## reduce
適合拿來做加總的方法,起手式為:
```javascript
const newArr = arr.reduce(function (prev, item, index) {
}, 0)
```
跟前面不同的是在函式後面加上一個逗號,逗號後面的參數為起始值。
> **參數說明:**
> * 第一個參數代表上一個,若沒有上一個的話,就是在逗號後面寫上 0。
> * 第二個參數代表當前的資料。
> * 第三個參數代表索引。
來看一下 prev 的值:
```javascript
const newArr = arr.reduce(function (prev, item, index) {
console.log(prev); //0, 500, 1000, 1500
return prev + 500
}, 0)
```
因為陣列資料有四筆,所以從頭開始總共會得到四筆資料。
#### 計算所有人加總的數值
若要計算所有人擁有的錢,可以這樣寫:
```javascript
const newArr = arr.reduce(function (prev, item, index) {
console.log(prev); //陸續加總的結果0 5000 11500 19000 27000
return prev + item.money
}, 0)
console.log(newArr); //27000
```
#### 比大小
可以透過 reduce 去做所有資料內容的對比,會選出指定條件的值,這邊選出最大值來看看。
```javascript
const newArr = arr.reduce(function (prev, item, index) {
console.log(prev);
return Math.max(prev, item.money)
}, 0)
console.log('newArr', newArr); //8000
```
## sort()
會改變原本的陣列內容。下方有一組陣列沒有按照順序,使用 sort(); 方法,並帶入頭尾參數做為判斷,便會按照順序排列或反向排列。
```javascript
const arr = [1, 5, 8, 7, 4, 6, 3, 2];
arr.sort((x, y) => return y - x);
console.log(arr); //8, 7, 6, 5, 4, 3, 2, 1
arr.sort((x, y) => return x - y);
console.log(arr); //1, 2, 3, 4, 5, 6, 7, 8
```
但若不使用判斷,則不會按照順序排列。
```javascript
const arr2 = [1, 5, 8, 7, 4, 6, 3, 2, 10, 9, 11];
arr2.sort();
console.log(arr2); //1, 10, 11, 2, 3, 4, 5, 6, 7, 8, 9
```
## 參考資料
* [JavaScript Array 陣列操作方法大全 ( 含 ES6 )](https://www.oxxostudio.tw/articles/201908/js-array.html#array_sort)
* [JavaScript 陣列處理方法 [filter(), find(), forEach(), map(), every(), some(), reduce()]](https://wcc723.github.io/javascript/2017/06/29/es6-native-array/)
* [Cheatsheet for Array Methods - JavaScript 陣列方法大全](https://w3c.hexschool.com/blog/6594e4ff)