---
# System prepended metadata

title: 11.27 JS-陣列
tags: [MFEE, Javascript]

---

# 11.27 JS-陣列

###### tags: `Javascript`、`MFEE`


## 零、目錄&待辦事項


## 壹、陣列

[講義](https://eddy-chang.gitbook.io/javascript-start-from-es6/part3/array)

* 陣列簡介
* 拷貝陣列的作法
1. 用for迴圈
```javascript=
const a = [1,2,3]
const b =[]
for (let i = 0; i < a.length; i++){
    b[i] = a[i]
}
// i其實就是index的意思
```
2. 用...語法
```javascript=
const c =[...a]
// 這是所謂的展開運算符，把a陣列給展開來放到c裡面，完成複製
```


## 貳、陣列重要屬性及方法
### 劇透：有副作用的方法
1. push()、pop()、unshift()、shift()
2. sort()、reverse()
3. forEach(function(v, i, array){
    return xxx
    })
### 一、檢查是否為陣列：array.isArray()
檢查陣列不能用typeof()，若用typeof會回傳物件，無法判斷是不是陣列。
要用isArray()。
```javascript=
const a = [1,2,3]
Array.isArray(a)
// console會回傳true
```
### 二、屬性：array.length，回傳陣列內資料的個數，重要
```javascript=
const a = [1,2,3,4]
a.length = 4
```
length其實可以更改陣列內的資料組成，因此可以用.length = 0來清空陣列。
```javascript=
const a = [1,2,3,4]
a.length = 5
console.log(a)
// 會印出[1,2,3,4,empty]

a.length = 2
console.log(a)
// 會印出[1,2]

// 因此若要清空陣列可以用 .length = 0
```
### 三、array.indexOf()，不重要，用findIndex()
找到第一個相符的會回傳他的索引值，後續就不找。若沒找到會回傳-1。
```javascript=
const a = [1,2,3,4,2,2]
a.indexOf(2) = 1
// 只會回傳第一個找到的index
```

### 四、array.push()、pop()、shift()、unshift()，重要
* **這四個方法有副作用，會改變原來的陣列**
* 這四個陣列有回傳值，但通常用不到所以不重要
1. push，從後面加進去。(有p是屁屁)
2. pop，把陣列最後一個值彈出來。(有p是屁屁)
3. shift，把陣列第一個值彈出來。
4. unshift，從前面加進去。(跟push一樣有u，是加進去)
```javascript=
const a = [1,2,3,4,5]
a.push(7)
// a = [1,2,3,4,5,7]

a.pop()
// a = [1,2,3,4,5]

a.unshift(6)
// a = [6,1,2,3,4,5]

a.shift()
// a = [1,2,3,4,5]
```

### 五、array.concat，合併陣列，被...取代，不重要
* 現在這個語法被...取代掉了，所以學...的做法就好
* 就是複製貼上嘛~
```javascript=
const a = [1,2,3,4]
const b = [5,6,7,8]
const c = [...a, ...b]
```
* 陣列不能用 + 的方式處理，會被轉成二組字串相加
```javascript=
const a = [1,2,3,4]
const b = [5,6,7,8]
const c = a + b
console.log(c)
// 印出 '1,2,3,45,6,7,8'
//真的是45，不是4,5
```

### 六、array.slice(頭,尾)，分割陣列，包頭不包尾，重要
* **沒有副作用!! 不會更改到原本的陣列!!**
* 也可以用來做拷貝陣列
```javascript=
const a = [1,2,3,4,5,6,7]
a.slice(1,4)
// 回傳[2,3,4]
// 但a = [1,2,3,4,5,6,7]，因為沒有副作用!

const b = a.slice(0)
// b = [1,2,3,4,5,6,7]
```
### 七、array.splice，不重要，跳過這個吧。
這個語法雖然功能多，但是參數太多了，不如直接用for迴圈去寫。

### 八、array.join()，把陣列組成字串
沒有副作用
```javascript=
const a = ['Hello', 'my', 'friend']
a.join()
// 系統預設幫你用,分割
// a = 'Hello,my,friend'

a.join(', ')
// a = 'Hello, my, friend'

a.join('')
// a ='Hellomyfriend'
 ```
 
### 九、array.split()，把字串拆成陣列
* 適用於csv檔案，用,分割的文字檔
```javascript=
const monthString = 'Jan,Feb,Mar,Apr,May'
const monthArray1 = monthString.split(',') 
//["Jan", "Feb", "Mar", "Apr", "May"]

//以下為錯誤示範
const monthArray2 = monthString.split()
// 他不知道怎麼分，沒有變化
//["Jan,Feb,Mar,Apr,May"]

const monthArray3 = monthString.split('') 
//按字元分割
//["J", "a", "n", ",", "F", "e", "b", ",", "M", "a", "r", ",", "A", "p", "r", ",", "M", "a", "y"]
```
### 十、修改陣列的內容，array.forEach(value, index, array){}
類似於for迴圈，但他們設計原理不同，也有一些明顯的差異。
不同之處在於以下幾點:
* forEach無法提早結束或中斷
* forEach被呼叫時，this會傳遞到回調函式(callback)裡
* **forEach方法具有副作用**

下面二個方法程式碼其實是一樣的

```javascript=
const a = [1, 2, 3, 4, 5]
for (let i = 0; i < a.length; i++) {
    console.log(i, a[i])
}
///1,2,3,4,5
```
```javascript=
const a = [1, 2, 3, 4, 5]
aArray.forEach(function(value, index, array){
// 對陣列元素作某些事
console.log(index, value)
// 0,1 
// 1,2 
// 2,3 
// 3,4 
// 4,5
})
```

### 十一、複製一個新的陣列做運用，array.map(value, index, array){}

* map比較常用。
* 會創造一個新的陣列，所以並不會產生副作用。

```javascript=
const a = [1, 2, 3, 4];
const new = a.map(function (value, index, array) {
    return value + 100
})

//原陣列不會被修改
console.log(a) // [1, 2, 3, 4]
console.log(new) // [101, 102, 103, 104]
```

### 十二、reduce，太難了放棄，老師也放棄了

### 十三、array.sort()，排序
* **有副作用!**

* 數字陣列直接於 .sort() 預設下則是以 ASCII 字符順序，不是數字大小。
```javascript=
const a = [1,5,2,87,10,54]
a.sort()
// [1, 10, 2, 5, 54, 87]
```
* 要多function(a,b)才是按數字由小到大 (由大到小就改成b-a)
* a, b 是把陣列的二個值放進來比較
```javascript=
const a = [1,5,2,87,10,54]
a.sort(function (a, b) {
  return a - b
})
```

### 十四、array.reverse()，反轉排序
* **有副作用!**
```javascript=
const fruit = ['蘋果', '芒果', '櫻桃', '香蕉' ]
fruit.reverse()

console.log(fruit)
//["香蕉", "櫻桃", "芒果", "蘋果"]
```

### 十五、array.find/findIndex(function(value, index, array){return value >= / <= / === 值})
* find是找值，findIndex是找索引(index)。
* 學findIndex就夠用了。找到符合某個值的參數後，再用array[i]的方式叫出那個值。

```javascript=
const aArray = [1, 3, 5, 7, 10, 22]
const bValue = aArray.find(function (value, index, array){
        return value > 6
    })
const cIndex = aArray.findIndex(function (value, index, array){
        return value > 6
    })

console.log(bValue) //7
console.log(cIndex) //3
console.log(aArray[cIndex]) // 7
```

### 十六、array.includes()

includes() 方法會判斷陣列是否包含特定的元素，並以此來回傳 true 或 false。

```javascript=
const a = [1, 2, 3];
console.log(a.includes(2)); // true
```

### 十七、array.filter(function(value, index array){})
filter通常用來依照條件過濾陣列，創造一個新的陣列
```javascript=
const a = [1, 3, 5, 7, 10, 22]

const b = a.filter(function (value, index, array){
        return value > 6
    })

console.log(a) //[1, 3, 5, 7, 10, 22]
console.log(b) //[7, 10, 22]
```

也可以用來去除掉某個值
```javascript=
const a = [1, 2, 2, 7, 2, 87]

const b = a.filter(function (value, index, array){
        return value !== 2
    })

console.log(a) //[[1, 2, 2, 7, 2, 87]
console.log(b) //[1, 7, 87]
```



## 參、

## 肆、

## 伍、

## 陸、

## 柒、

## 捌、

## 玖、

## 拾、