はじめに
勉強会向けに用意したJavaScript配列操作についての演習問題です.
ターゲットが狭いので体系的学習をしている人には向かない可能性がありますが,ご了承ください.
解答例についての注意事項
各問題は独立していません.前の問題の答えを使うものがあります.解答例は前の問題の解答例のプログラムがある前提で書きました.1問の解答例だけをコピペしても動かない可能性があります.動かない場合は前の問題の回答例を適宜コピペしてください.
問題
1. 0から99までの連番配列をつくる
2. この配列を使って総和を求める
3. キーとしてnumber, isPrime, isEven, divisorCountを持つオブジェクトの配列を作る(以下の関数を使用しても良い)
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までの連番配列をつくる
思いつきそうなもの
const array = []
for (let i = 0; i < 100; i++) {
array.push(i)
}
短い書き方
const array = [...Array(100)].map((_, i) => i)
2. この配列を使って総和を求める
普通の書き方
let sum = 0;
array.forEach(num => {
sum += num
});
reduceを使った場合
こちらはsum
をconst
にできることが利点
const sum = array.reduce((acc, cur) => acc + cur, 0);
reduceについて
使用例
array.reduce(
(accumulator, currentValue) => accumulator + currentValue,
initialValue,
);
3. キーとしてnumber, isPrime, isEven, divisorCountを持つオブジェクトの配列を作る(以下の関数を使用しても良い)
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)
}));
4. 約数について昇順ソートする
const divisorSorted = objects.sort((a, b) => a.divisorCount - b.divisorCount);
5. 素数から成る数値配列を作る
const primes = objects.filter(obj => obj.isPrime).map(obj => obj.number);
6. 素数の和を求める
const primeSum = primes.reduce((acc, cur) => acc + cur, 0);
7. 素数から成る数値配列を降順ソートして値を出力することでもとの配列と比較する
const reversePrimes = primes.toSorted((a, b) => b - a);
console.log(primes);
console.log(reversePrimes);
解答例まとめ
全プログラムを結合したものです.
複数の回答例がある場合は片方のみを採用しました.
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);