---
# System prepended metadata

title: 筆記｜第三堂：陣列與物件之資料處理
tags: [學習筆記, JavaScript]

---

`#JavaScript` `#六角前端課程` `#學習筆記` `#骨力走傱`

## 陣列進階操作
### 新增
#### `unshift`
```javascript=
let arr = [1, 2, 3];
arr.unshift(0);

console.log(arr); // [0, 1, 2, 3];
```
* `變數.unshift ( 要寫入的值 );`
* `unshift` 為 JavaScript 提供的方法，可將資料寫入至陣列**前端**。

### 刪除
#### `shift`
```javascript=
let arr = ["red", "pink", "blue"];
arr.shift();

console.log(arr); // ["pink", "blue"];
```
* `變數.shift ( 空白 );`
* 刪除陣列中，**第一筆**資料。

#### `pop`
```javascript=
let arr = [a, b, c];
arr.pop();

console.log(arr); // [a, b];
```
* `變數.pop ( 空白 );`
* 因為是要刪除資料，故 `()` 空白即可。
* 刪除陣列中，**最後一筆**資料。

### 新增與刪除
#### `splice`
```javascript=
let pets = ["cat", "dog", "fish"];
pets.splice(3, 1, "brid");

console.log(pets); // ['cat', 'dog', 'fish', 'brid']
```
* `變數.splice( 參數一, 參數二, 參數三 );`
    * 參數一：刪除對象的索引值。
    * 參數二：刪除幾筆（包含自己）。
    * 參數三：要新增的內容。
*  `pets.splice(3, 1, "brid");` 表示刪除陣列中，索引值為 3 的值，刪除一筆，並寫入 `"brid"`。
*  可以只寫 `pets.splice(0, 1);`，表示只有刪除的功能，未寫入新的值。

### 取得長度
#### `length`
```javascript=
let foods = ["beef", "pork", "chicken"];

console.log(foods.length); // 3
```
* `變數.length`
* `length` 也可以應用在取得最後一筆資料。
    * `foods[foods.length-1]; // "chicken"`

## 物件進階操作
### 修改
#### `.`
```javascript=
let band = {
    musicGenre : "rock",
    bassNum : 1,
    guitarNum : 1,
    drumNum : 1,
};

band.musicGenre = "post-rock";
band.guitarNum += 1;

console.log(band); // {musicGenre: 'post-rock', bassNum: 1, guitarNum: 2, drumNum: 1}
```
* `變數.屬性名稱 = 要修改的值;`

### 刪除
#### `delete`
```javascript=
let band = {
    musicGenre : "rock",
    bassNum : 1,
    guitarNum : 1,
    drumNum : 1,
};

band.musicGenre = "post-rock";
delete band.guitarNum;

console.log(band); // {musicGenre: 'post-rock', bassNum: 1, drumNum: 1}
```

* 使用 `delete` 運算子，刪除物件中的屬性。

### 讀取資料
#### 使用點記法 `.` 讀取
```javascript=
let band = {
    musicGenre : "rock",
    bassNum : 1,
    guitarNum : 1,
    drumNum : 1,
};

console.log(band.musicGenre); // rock
```
* 可以使用 `.` 讀取物件中屬性的資料。

#### 使用括弧記法 `[""]` 讀取
```javascript=
let band = {
    musicGenre : "rock",
    bassNum : 1,
    guitarNum : 1,
    drumNum : 1,
};

console.log(band["musicGenre"]); // rock
```
* `變數["屬性名稱"];`
* 若使用 `[]` 讀取屬性資料，記得加上 `""`，否則會被電腦視為變數，那又是另一種讀取的方法了。

#### 使用 `[變數]` 讀取
```javascript=
let band = {
    musicGenre : "rock",
    bassNum : 1,
    guitarNum : 1,
    drumNum : 1,
};

let type = "musicGenre";

console.log(band[type]); // rock
```
* 可以將屬性名稱賦值在一個變數上，若要讀取 `"rock"` 這個值，語法為 `band[type]`，也就是 `物件變數[儲存屬性值的變數]`。
* 此時 `type` 指向了 `band` 的記憶體位置（傳址特性），因此可以用 `band[type]` 讀取 `"rock"`。
* 這個讀取方式稱為**動態取值**，在進階應用上經常出現。

### 如何操作非英文字母的屬性名稱？
#### 修改
```javascript=
let band = {
    musicGenre : "rock",
    bassNum : 1,
    guitarNum : 1,
    drumNum : 1,
};

band["吉祥物"] = "土虱";

console.log(band); // {musicGenre: 'rock', bassNum: 1, guitarNum: 1, drumNum: 1, 吉祥物: '土虱'}
```

#### 讀取
```javascript=
let band = {
    musicGenre : "rock",
    bassNum : 1,
    guitarNum : 1,
    drumNum : 1,
    "吉祥物" : "土虱"
};

console.log(band["吉祥物"]); // 土虱
```
* 屬性名稱為非英文字母、空格、特殊符號時，必須使用 `[""]` 讀取，否則語法會錯誤。
* 相對的，若寫入的資料也是上述情形，必須使用 `[""]` 寫入資料。

## 陣列與物件的混合應用
### 範例
> 描述市場裡的攤位。

```javascript=
let mark = [
    {
        bossName: "Tom",
        sale: "fruit",
        isOpen: false
    },
    {
        bossName: "Peter",
        sale: "fish",
        isOpen: true 
    }
];

console.log(mark);
// {bossName: 'Tom', sale: 'fruit', isOpen: false}
// {bossName: 'Peter', sale: 'fish', isOpen: true}
```

### 讀取
#### 請讀取第一筆物件資料
```javascript=
let mark = [
    {
        bossName: "Tom",
        sale: "fruit",
        isOpen: false
    },
    {
        bossName: "Peter",
        sale: "fish",
        isOpen: true 
    }
];
```

* `console.log(mark[0]); // {bossName: 'Tom', sale: 'fruit', isOpen: false}`

#### 請讀取第二筆物件中 sale 的資料
```javascript=
let mark = [
    {
        bossName: "Tom",
        sale: "fruit",
        isOpen: false
    },
    {
        bossName: "Peter",
        sale: "fish",
        isOpen: true 
    }
];
```

* `console.log(mark[1].sale); // fish`

#### 小結

|      | 讀取方法 | 備註                                     |
| ---- | -------- | ---------------------------------------- |
| 陣列 | `[]`     | 使用索引值表示，要查詢陣列中第幾筆資料。 |
| 物件 | `.`      | 用 `.` 讀取屬性名稱儲存的值。              | 

## JSON
### 介紹
* JSON（JavaScript Object Notation）是一種輕量級資料交換格式。
* 雖然以 JavaScript 語法為基礎，但可獨立使用，許多程式語言可讀取並產生 JSON。
* 經常用於傳遞與儲存資料，例如前、後端交換資料，或與 API 交換資料。

#### 資料來源
* [使用 JSON 資料](https://developer.mozilla.org/zh-TW/docs/Learn_web_development/Core/Scripting/JSON)

### 讀取
```json=
[
    {
        Kind: "公共充電站",
        Charge: "免費",
        Location: "新興區公所 ",
        Address: " 高雄市新興區中正三路34號1樓(室內停車場)"
    },
    {
        Kind: "公共充電站",
        Charge: "免費",
        Location: "高雄市民權停車場(機車停車場) ",
        Address: " 高雄市新興區民權一路221號"
    },
    {
        Kind: "公共充電站",
        Charge: "免費",
        Location: "為鑫機車行 ",
        Address: " 高雄市新興區民族二路126號"
    }
];
```
由於 JSON 的基礎是 JavaScript，因此資料格式非常類似，可以將 JSON 賦值在變數上，並透過陣列或物件的方法，讀取需要的資料。

### 篩選
> 試著篩選出第三筆資料

#### 資料
```json=
[
    {
        Kind: "公共充電站",
        Charge: "免費",
        Location: "新興區公所 ",
        Address: " 高雄市新興區中正三路34號1樓(室內停車場)"
    },
    {
        Kind: "公共充電站",
        Charge: "免費",
        Location: "高雄市民權停車場(機車停車場) ",
        Address: " 高雄市新興區民權一路221號"
    },
    {
        Kind: "公共充電站",
        Charge: "免費",
        Location: "為鑫機車行 ",
        Address: " 高雄市新興區民族二路126號"
    }
];
```

#### 處理結果
```javascript=
let data = [
    {
        Kind: "公共充電站",
        Charge: "免費",
        Location: "新興區公所 ",
        Address: " 高雄市新興區中正三路34號1樓(室內停車場)"
    },
    {
        Kind: "公共充電站",
        Charge: "免費",
        Location: "高雄市民權停車場(機車停車場) ",
        Address: " 高雄市新興區民權一路221號"
    },
    {
        Kind: "公共充電站",
        Charge: "免費",
        Location: "為鑫機車行 ",
        Address: " 高雄市新興區民族二路126號"
    }
];

let obj = data[2];

console.log(obj); // {Kind: '公共充電站', Charge: '免費', Location: '為鑫機車行 ', Address: ' 高雄市新興區民族二路126號'}
```

## 與邏輯判斷的混合應用
### 範例
> 觀察客人體溫。

```javascript=
let flixStatus = {
    name : "Flix",
    age : "18",
    status: ""
};

flixStatus.degree = 37;

if (flixStatus.degree >= 37.5) {
    console.log("您不得進入。");
    flixStatus.status = "您不得進入。" // 寫入狀態
} else {
    console.log("您可以進入。");
    flixStatus.status = "您可以進入。" // 寫入狀態
};

console.log(flixStatus); // {name: 'Flix', age: '18', status: '您可以進入。', degree: 37}
```