JavaScript配列操作についての演習問題

## はじめに
勉強会向けに用意したJavaScript配列操作についての演習問題です．
ターゲットが狭いので体系的学習をしている人には向かない可能性がありますが，ご了承ください．

## 解答例についての注意事項
各問題は独立していません．前の問題の答えを使うものがあります．解答例は前の問題の解答例のプログラムがある前提で書きました．1問の解答例だけをコピペしても動かない可能性があります．動かない場合は前の問題の回答例を適宜コピペしてください．

## 問題
### 1. 0から99までの連番配列をつくる

### 2. この配列を使って総和を求める

### 3. キーとしてnumber, isPrime, isEven, divisorCountを持つオブジェクトの配列を作る（以下の関数を使用しても良い）
```javascript
const isPrime = (num) => {
    for (let i = 2; i < num; i++) {
        if (num % i === 0) return false;
    }
    return num >= 2;
}

const isEven = (num) => num % 2 === 0;

const divisorCount = (num) => {
    let count = 0;
    for (let i = 1; i <= num; i++) {
        if (num % i === 0) count++;
    }
    return count;
}
```

### 4. 約数について昇順ソートする

### 5. 素数から成る数値配列を作る

### 6. 素数の和を求める

### 7. 素数から成る数値配列を降順ソートして値を出力することでもとの配列と比較する

## 回答例

### 1. 0から99までの連番配列をつくる
思いつきそうなもの
```javascript
const array = []
for (let i = 0; i < 100; i++) {
    array.push(i)
}
```
    
短い書き方
```javascript
const array = [...Array(100)].map((_, i) => i)
```
                       

### 2. この配列を使って総和を求める
普通の書き方
```javascript
let sum = 0;
array.forEach(num => {
    sum += num
});
```

reduceを使った場合
こちらは`sum`を`const`にできることが利点
```javascript
const sum = array.reduce((acc, cur) => acc + cur, 0);
```

#### reduceについて
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce

使用例
```javascript
array.reduce(
  (accumulator, currentValue) => accumulator + currentValue,
  initialValue,
);
```


### 3. キーとしてnumber, isPrime, isEven, divisorCountを持つオブジェクトの配列を作る（以下の関数を使用しても良い）
```javascript
const isPrime = (num) => {
    for (let i = 2; i < num; i++) {
        if (num % i === 0) return false;
    }
    return num >= 2;
}

const isEven = (num) => num % 2 === 0;

const divisorCount = (num) => {
    let count = 0;
    for (let i = 1; i <= num; i++) {
        if (num % i === 0) count++;
    }
    return count;
}
```

```javascript
const objects = array.map(num => ({
    number: num,
    isPrime: isPrime(num),
    isEven: isEven(num),
    divisorCount: divisorCount(num)
}));
```

### 4. 約数について昇順ソートする
```javascript
const divisorSorted = objects.sort((a, b) => a.divisorCount - b.divisorCount);
```

### 5. 素数から成る数値配列を作る
```javascript
const primes = objects.filter(obj => obj.isPrime).map(obj => obj.number);
```

### 6. 素数の和を求める
```javascript
const primeSum = primes.reduce((acc, cur) => acc + cur, 0);
```

### 7. 素数から成る数値配列を降順ソートして値を出力することでもとの配列と比較する
```javascript
const reversePrimes = primes.toSorted((a, b) => b - a);
console.log(primes);
console.log(reversePrimes);
```
## 解答例まとめ
全プログラムを結合したものです．
複数の回答例がある場合は片方のみを採用しました．
```javascript
const array = [...Array(100)].map((_, i) => i)
console.log("#1. ", array);

const sum = array.reduce((acc, cur) => acc + cur, 0);
console.log("#2. ", sum);

const isPrime = (num) => {
    for (let i = 2; i < num; i++) {
        if (num % i === 0) return false;
    }
    return num >= 2;
}

const isEven = (num) => num % 2 === 0;

const divisorCount = (num) => {
    let count = 0;
    for (let i = 1; i <= num; i++) {
        if (num % i === 0) count++;
    }
    return count;
}

const objects = array.map(num => ({
    number: num,
    isPrime: isPrime(num),
    isEven: isEven(num),
    divisorCount: divisorCount(num)
}));
console.log("#3. ", objects);

const divisorSorted = objects.sort((a, b) => a.divisorCount - b.divisorCount);
console.log("#4. ", divisorSorted);

const primes = objects.filter(obj => obj.isPrime).map(obj => obj.number);
console.log("#5. ", primes);

const primeSum = primes.reduce((acc, cur) => acc + cur, 0);
console.log("#6. ", primeSum);

const reversePrimes = primes.toSorted((a, b) => b - a);
console.log("#7. ", reversePrimes);

console.log("#8", primes);
console.log("#8", reversePrimes);
```