---
# System prepended metadata

title: 陣列操作
tags: [JavaScript]

---

###### tags: `JavaScript`

# 陣列操作

## forEach

```javascript=1
let data = [1,2,3];
data.forEach(function(item, index, array){
    console.log(item, index, array);
    // 結果如下
    // 1, 0, [1, 2, 3]
    // 2, 1, [1, 2, 3]
    // 3, 2, [1, 2, 3]
});
```

## map

1. 能將原始帳列運算後，重新組合回傳一個新陣列
2. 不會引響到原本的陣列
3. map 沒有 return 會回傳 undefined

```javascript=1
let data = [1,2,3];
let newData = data.map(function(item){
    return item * item
});
console.log(data); // [1, 2, 3]
console.log(newData); // [1, 4, 9]
```

```javascript=1
let data = [1,5,10,8,4,2];
let newData = data.map(function(item){
    return item > 5
});

// 組合物件
let newData1 = data.map(function(item){
    let obj = {}
    obj.checkNum = item > 5
    return obj
});
console.log(data); // [1, 5, 10, 8, 4, 2]
console.log(newData); // [false, false, true, true, false, false]
console.log(newData1); // [{…}, {…}, {…}, {…}, {…}, {…}]
```
![](https://i.imgur.com/Nfz9OUK.png)


### forEach 與 map 差別

```javascript=1
let data = [1,2,3];
let newData = data.forEach(function(item){
    return item * item
});
console.log(data); // [1, 2, 3]

// 因為使用 forEach 他並不會重新組合回傳一個新陣列，所以是 undefined
// 也無法使用 return 回傳值
console.log(newData); // undefined
```

## filter 篩選全部的資料

1. 塞選出符合條件的內容，重新組合回傳一個新陣列
2. 不會引響到原本的陣列

```javascript=1
let data = [1,4,10,15];
let newData = data.filter(function(item){
    return item > 5
});
console.log(data); // [1,4,10,15]
console.log(newData); // [10, 15]
```

範例 (通常用於比價、下拉選市區、比較)
```javascript=1

// 分數
let scoreData = [
    {
        name: '阿呆',
        score: 100,
    },
    {
        name: '阿美',
        score: 61,
    },
    {
        name: '阿新',
        score: 40,
    },
];

// 篩塞選及格的人
let filterScore = scoreData.filter(function(item){
    return item.score >= 60
});
console.log(filterScore);
// (2) [{…}, {…}]
// 0: {name: '阿呆', score: 100}
// 1: {name: '阿美', score: 61}

```


## find 尋找第一筆符合條件的資料

1. 找出符合條件的第一筆資料，重新組合回傳一個新陣列
2. 不會引響到原本的陣列


```javascript=1
let data = [1,4,10,15];
let newData = data.find(function(item){
    return item > 5
});
console.log(data); // [1,4,10,15]
console.log(newData); // [10]
```

## findIndex 尋找資料索引

1. 找出符合條件的第一筆資料，回傳索引值
2. 不會引響到原本的陣列

```javascript=1
let data = [10,20,30];
let newData = data.findIndex(function(item){
    return item >=15
});
console.log(data); // [10,20,30]
console.log(newData); // 1
```

## reduce 陣列元素累加

1. 能將陣列內數值做累加
2. 不會引響到原本的陣列

```javascript=1
// 純數字
const numbers = [1, 2, 3, 4, 5];
const total = numbers.reduce((a, b) => {
  return a + b;
}, 0);

console.log(total); // 15
console.log(typeof total); // number

// 裡面有字串
const strInArr = [1, 2, "3", 4, 5];
const strInArrTotal = strInArr.reduce((a, b) => {
  return a + b;
}, 0);

console.log(strInArrTotal); // '3345'
console.log(typeof strInArrTotal); // string

// 裡面有陣列
const arrInArr = [1, 2, [69, 32], 4, 5];
const arrInArrTotal = arrInArr.reduce((a, b) => {
  return a + b;
}, 0);

console.log(arrInArrTotal); // '369,3245'
console.log(typeof arrInArrTotal); // string

// 裡面有物件
const objInArr = [1, 2, [{id: 10}, {id: 99}], 4, 5];
const objInArrTotal = objInArr.reduce((a, b) => {
  return a + b;
}, 0);
console.log(objInArrTotal); // '3[object Object],[object Object]45'
console.log(typeof objInArrTotal); // string

```

## at 尋找陣列位置資料

1. 找陣列的位置並且回傳值
2. 不會引響到原本的陣列

```javascript=1
// 可以填 -1 找到陣列最後一筆資料
const array1 = [5, 12, 8, 130, 44, 66, 99, 10, 50];
console.log(array1.at(-1)); // 50

// 也可以往後找第 N 筆
console.log(array1.at(-3)); // 99
```

## concat 合併陣列

1. 合併 2 筆(以上)的陣列
2. 不會引響到原本的陣列

```javascript=1
const array1 = ['a', 'b', 'c'];
const array2 = ['d', 'e', 'f'];
const array3 = array1.concat(array2);
console.log(array3); // ["a", "b", "c", "d", "e", "f"]

// 合併多筆
const num1 = [1, 2, 3];
const num2 = [4, 5, 6];
const num3 = [7, 8, 9];

const numbers = num1.concat(num2, num3);

console.log(numbers); // [1, 2, 3, 4, 5, 6, 7, 8, 9]

// 合並陣列包陣列
const arr1 = ['a', 'b', 'c'];
const arr2 = [[2, 3], 4]
const newArr = arr1.concat(1, arr2);

console.log(newArr); // ["a", "b", "c", 1, [2, 3], 4]
```

## join 合併陣列轉成字串

```javascript=1
const arr = ['nick', 'chang']
console.log(arr.join(' ')) // nick chang

const obj = [{ id: 1 }, { id: 2 }]
console.log(obj.join(' ')) // [object Object] [object Object]

const integrated = [1, 2, 'asd', '!@#df', [123, 999, { id: 100 }]]
console.log(integrated.join('-')) // 1-2-asd-!@#df-123,999,[object Object]
```