JavaScript~配列の操作~その２

>#はじめに
JavaScriptでの配列の操作
``filter``,``map``,``reduce``,``join``について
この4つは、全て__``非破壊的``__(元の配列は変更しない)メソッド

前回:[JavaScript~配列の操作~その１](https://qiita.com/yoshihide_tsukamoto/items/c1d28048b76431397b87)

##使用する配列
```javascript
const users = [
  { name: "A", age: 23, country: "ja" },
  { name: "J", age: 27, country: "usa" },
  { name: "R", age: 64, country: "usa" },
  { name: "Y", age: 48, country: "ja" },
  { name: "B", age: 33, country: "ja" },
]
```
__※これ以外の配列を使う場合はコード内に記載__

##filter (配列内から一致するものを配列で返す)

```javascript
const countryFilter = users.filter(user => user.country === "usa")
console.log(countryFilter)
/*
[
  { name: 'J', age: 27, country: 'usa' },
  { name: 'R', age: 64, country: 'usa' }
]
 */
```


```javascript

const ageFilter = users.filter((user) => {
  if (user.age > 30) {//ageが30より大きい
    return user
  }
})
console.log(ageFilter)
/*
[
  { name: 'R', age: 64, country: 'usa' },
  { name: 'Y', age: 48, country: 'ja' },
  { name: 'B', age: 33, country: 'ja' }
]
 */
```
``第一引数``に配列要素、``第二引数``に__``map``__と同様にインデックスが取れる

##map (元の配列から新しい配列を作ったり、変更を加えたり)

```javascript
const nameMap = users.map(user => user.name)//nameだけの配列を作る
console.log(nameMap)//[ 'A', 'J', 'R', 'Y', 'B' ]

const ageMap = users.map(user => user.age)//ageだけの配列を作る
console.log(ageMap)//[ 23, 27, 64, 48, 33 ]

const countryMap = users.map(user => user.country.toUpperCase())//大文字に変換
console.log(countryMap)// [ 'JA', 'USA', 'USA', 'JA', 'JA' ]

const ageAddintion = ageMap.map(age => age + 10)//ageに10足す
console.log(ageAddintion)//[ 33, 37, 74, 58, 43 ]

//変更を加えた配列を合わせて新しい配列を作る
const nameAndAge = nameMap.map((name, i) => ({name: name, age: ageAddintion[i], country: countryMap[i]}))
console.log(nameAndAge)
/*
[
  { name: 'A', age: 33, country: 'JA' },
  { name: 'J', age: 37, country: 'USA' },
  { name: 'R', age: 74, country: 'USA' },
  { name: 'Y', age: 58, country: 'JA' },
  { name: 'B', age: 43, country: 'JA' }
]
*/
console.log(users)//元の配列はそのまま
/*
[
  { name: 'A', age: 23, country: 'ja' },
  { name: 'J', age: 27, country: 'usa' },
  { name: 'R', age: 64, country: 'usa' },
  { name: 'Y', age: 48, country: 'ja' },
  { name: 'B', age: 33, country: 'ja' }
]
*/
```

__長さの違う配列をいれると__

```javascript
const test = [ 33, 37, 74, 58, 43, 21, 40 ]//21, 40を増やした

const sample1 = nameMap.map((name, i) => ({name: name, age: test[i], country: countryMap[i]}))//age部分を変える
console.log(sample1)//nameMapの長さが基準になるので増やした二つは表示されない
/*
[
  { name: 'A', age: 33, country: 'JA' },
  { name: 'J', age: 37, country: 'USA' },
  { name: 'R', age: 74, country: 'USA' },
  { name: 'Y', age: 58, country: 'JA' },
  { name: 'B', age: 43, country: 'JA' }
]
*/
//testを基準にすると
const sample2 = test.map((test, i) => ({name: nameMap[i], age: test, country: countryMap[i]}))
console.log(sample2)
/*
[
  { name: 'A', age: 33, country: 'JA' },
  { name: 'J', age: 37, country: 'USA' },
  { name: 'R', age: 74, country: 'USA' },
  { name: 'Y', age: 58, country: 'JA' },
  { name: 'B', age: 43, country: 'JA' },
  { name: undefined, age: 21, country: undefined },
  { name: undefined, age: 40, country: undefined }
]
*/
//[5][6]にname, countryの値はないのでundefinedになる
```
``第一引数``に配列要素、``第二引数``にインデックスが取れる、``第三引数``には配列そのものが入る

##reduce (配列内を合計したりとか)

```javascript

const numbers = [3, 7, 1, 8, 15]
const sum1 = numbers.reduce((a, num) => a + num, 0)//aの初期値は0
console.log(sum1)//34

//第一引数が初期値になりnum, 0としている部分の0がaに入る事になる
const sum2 = numbers.reduce((a, num) => a + num, 100)//aの初期値は100
console.log(sum2)//134

//初期値が0などの場合省略できる
const sum3 = numbers.reduce((a, num) => a + num)//aの初期値は配列の[0]の3になり、そこに順番に足していくイメージ
console.log(sum3)//34

const hello = ["H", "e", "l", "l", "o", "W", "o", "r", "l", "d"]//この様な文字列の配列も一つの値にできる
const world = hello.reduce((a, b) => a + b)
console.log(world)//HelloWorld
```

イメージとしては

```javascript
let a = 0
    a += 3//0 + 3
    a += 7//3 + 7
    a += 1//10 + 1
    a += 8//11 + 8
    a += 15//19 + 15
console.log(a)//34
```
##join (配列内の文字列を一つの文字列にまとめる)

```javascript

const hello = ["H", "e", "l", "l", "o", "W", "o", "r", "l", "d"]//この様な文字列の配列も一つの値にできる
const world = hello.join()
console.log(world)//H,e,l,l,o,W,o,r,l,d
```
第一引数はセパレータで、デフォルトは``,``
文字列同士の間になにを入れるか指定できる

```javascript

const world1 = hello.join("-")//-で区切る
console.log(world1)//H-e-l-l-o-W-o-r-l-d

const world2 = hello.join("")//空文字
console.log(world2)//HelloWorld
```
以上です！