JavaScriptのarray(配列)をいい感じにするメソッド

## forEach

for文を簡単に書けるようになったやる

```js
let posts = [
     { id: 23, title: 'JSニュース' },
      { id: 52, title: 'リファクター・シティ' },
      { id: 105, title: 'Rubyの良いところ' }
];


console.log(posts.forEach(post))
```

### 計算して配列に入れる

```js
var images = [
  { height: 10, width: 30 },
  { height: 20, width: 90 },
  { height: 54, width: 32 }
];

var areas = []

images.forEach(function(image) {
	areas.push(image.height * image.width);
})


console.log(areas)
```

## map

pushしないで格納する

### オブジェクトの配列から興味のある値だけを引き抜く

```js
var images = [
  { height: '34px', width: '39px' },
  { height: '54px', width: '19px' },
  { height: '83px', width: '75px' },
];

var heights = images.map(function(image){
	return image.height;
})

console.log(heights)
```

### mapで演算

```js
var trips = [
  { distance: 34, time: 10 },
  { distance: 90, time: 50 },
  { distance: 59, time: 25 }
];

var speeds = trips.map(function(trip){
	return trip.distance / trip.time;	
})

console.log(speeds)
```

### pluckの実装 

object['foo']みたいな

```js
function pluck(array, property) {
  return array.map(function(element) {
  	return element[property];
   })
}

var colorObjects = [{ color: '赤' }, { color: '青' }, { color: '黄色' }];

var colorNames = pluck(colorObjects, 'color');


console.log(colorNames)
```

## filter

条件でtrueだったら配列に入れる

### 値の条件付き絞り込み

```js
var numbers = [15, 25, 35, 45, 55, 65, 75, 85, 95];

var filteredNumbers =  numbers.filter(function(number) {
		return number > 50;
})

console.log(filteredNumbers);
```

```js
var users = [
 { id: 1, admin: true },  
 { id: 2, admin: false },
 { id: 3, admin: false },
 { id: 4, admin: false },
 { id: 5, admin: true },
];

var filteredUsers = users.filter(function(user) {
	return user.admin === true;
})

console.log(filteredUsers);
```

### rejectを実装
falseだったら格納するようにする(それ以外を格納する)

```js
function reject(array, iteratorFunction) {
  return array.filter((element) => {
      return !iteratorFunction(element);
  });
}

var numbers = [10, 20, 30];
var lessThanFifteen = reject(numbers, function(number){
 return number > 15; // この条件以外を格納したい
});

console.log(lessThanFifteen);

```

## find
特定のデータを1つ見つける

::: note warn
注意は最初のtrueになった1件目だけを返す
:::

### 真偽値がtrueのものを探す

```js
var users = [
  { id: 1, admin: false },
  { id: 2, admin: false },
  { id: 3, admin: true }
];

var admin = users.find(function(user) {
	return user.admin
})

console.log(admin)
```

### 特定の条件のものを探す

```js
var accounts = [
  { balance: -10 },
  { balance: 12 },
  { balance: 0 }
];

var account = accounts.find(function(account) {
	return account.balance === 12;
})

console.log(account);

```

### findWhere関数

あるオブジェクトのプロパティがある値をもっているかどうかを探す
height: 20 を探す

```js
function findWhere(array, criteria) {
  return array.find(function(element) {
    var property = Object.keys(criteria); // プロパティがheightであることを伝える
    console.log(element[property]) // laddesのheightの情報
    console.log(criteria[property]) // プロパティのheightのものの情報
  	return element[property] === criteria[property]
  })
}


var ladders = [
 { id: 1, height: 20 },
 { id: 3, height: 25 }
];
 
console.log(findWhere(ladders, { height: 25 }))
```

### アンケートが全員回答済みか

```js
var users = [
  { id: 21, hasSubmitted: true },
  { id: 62, hasSubmitted: false },
  { id: 4, hasSubmitted: true }
];

var hasSubmitted = users.every(function(user) {
	return user. hasSubmitted
})

console.log(hasSubmitted)
```

## every

真偽値を返す
すべてのデータが条件をtrueである
フォームのバリデーションがすべてのinputで満たしてしるかなどのチェックに使える

一つでも条件を満たさないとfalseを返す
```js
true && false && true = false 
```

すべて条件を満たすとtrueを返す


## some

真偽値を返す
一部のデータが条件をtrueである

一つでも条件を満たすとtrueを返す
```js
true || false || true = true
```

すべて条件を満たさないとfalseを返す

### 通信中のリクエストの確認
ひとつでも条件を満たせばtrue

```js
var requests = [
  { url: '/photos', status: 'complete' },
  { url: '/albums', status: 'pending' },
  { url: '/users', status: 'failed' }
];

var inProgress = requests.some(function(request) {
	return request.status === 'pending'
})

console.log(inProgress)
```

## reduce

合計を求める
第二引数に初期値を持つ

### 初期値が0で合計を求める

```js
var trips = [{ distance: 34 }, { distance: 12 } , { distance: 1 }];

var totalDistance = trips.reduce(function(sum, trip) {
  return trip.distance + sum;
}, 0)

console.log(totalDistance)
```

### 初期値がオブジェクト

```js
var desks = [
  { type: 'sitting' },
  { type: 'standing' },
  { type: 'sitting' },
  { type: 'sitting' },
  { type: 'standing' }
];

var deskTypes = desks.reduce(function(prev, desk) {
  console.log(desk.type);
	if (desk.type === "sitting") {
  	prev.sitting += 1
  }
  
  if (desk.type === 'standing') {
  	prev.standing += 1
  }

   return prev;
}, { sitting: 0, standing: 0 });

console.log(deskTypes);
```

## unique関数のかわり
重複したデータを纏める


```js
function unique(array) {
   return [...new Set(array)];
}


var numbers = [1, 1, 2, 3, 4, 4];

console.log(unique(numbers))
```