
JavaScriptのイベント処理:クリック、フォーム入力からバブリング・デリゲーションまで
はじめに JavaScriptのイベント処理は、インタラクティブなウェブアプリケーション開発の核心です。ユーザーのクリック、フォーム入力、キーボード操作など、あ […]
JavaScriptの配列は、データの集合を効率的に操作するための強力なメソッドを多数提供しています。ES5(ECMAScript 5)で導入された配列メソッドは、関数型プログラミングスタイルを可能にし、コードをより宣言的に書くことができます。
const numbers = [1, 2, 3];
// 従来のforループ
for (let i = 0; i < numbers.length; i++) {
console.log(numbers[i]);
}
// forEachを使用
numbers.forEach(number => {
console.log(number);
});
特徴:
undefined
break
が使えない)const doubled = numbers.map(number => number * 2);
console.log(doubled); // [2, 4, 6]
特徴:
const evens = numbers.filter(number => number % 2 === 0);
console.log(evens); // [2]
特徴:
true
を返した要素のみ含まれるconst sum = numbers.reduce((accumulator, current) => accumulator + current, 0);
console.log(sum); // 6
特徴:
const users = [
{ id: 1, name: '太郎' },
{ id: 2, name: '花子' }
];
const user = users.find(user => user.id === 2);
console.log(user); // { id: 2, name: '花子' }
const index = users.findIndex(user => user.name === '太郎');
console.log(index); // 0
const hasEven = numbers.some(n => n % 2 === 0); // true
const allEven = numbers.every(n => n % 2 === 0); // false
const unsorted = [3, 1, 4, 2];
const sorted = unsorted.sort((a, b) => a - b); // [1, 2, 3, 4]
注意点:
配列メソッドはチェーンして使用できます。メソッドチェーン(method chaining)とは、複数のメソッドを「ドット(.)」でつなげて連続して呼び出す書き方です。処理を一行でスッキリ書けるのが特徴です。
const result = numbers
.filter(n => n % 2 === 0) // 偶数だけ抽出
.map(n => n * 3) // 3倍する
.reduce((sum, n) => sum + n, 0); // 合計を計算
console.log(result); // 6 (2 * 3 = 6)
配列やオブジェクトの中身を展開する記号。
const arr1 = [1, 2, 3];
const arr2 = [...arr1, 4, 5]; // [1, 2, 3, 4, 5]
配列のようなもの(Array-like)やイテラブル(例:文字列、Set)を、本物の配列に変換するメソッド。
const arrayLike = { 0: 'a', 1: 'b', length: 2 };
const realArray = Array.from(arrayLike); // ['a', 'b']
配列やオブジェクトの中の値を、変数にまとめて取り出す書き方。
const [first, second, ...rest] = [1, 2, 3, 4, 5];
console.log(first); // 1
console.log(rest); // [3, 4, 5]
for
ループの方が高速な場合ありmap
/filter
/slice
は新しい配列を作成(メモリ使用量に注意)some
/every
は条件を満たせば途中で終了 const numbers = [1, 2, 3, 4, 5];
const mixed = [1, 'apple', 2, 'banana', true, 'orange'];
const arr = [10, 20, 30];
arr.forEach(num => {
num = num * 2;
});
console.log(arr);
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const people = [
{ name: '太郎', age: 25 },
{ name: '花子', age: 30 },
{ name: '次郎', age: 35 }
];
const arr1 = [1, 2, 3];
const arr2 = [2, 3, 4, 5];
const fruits = ['apple', 'banana', 'cherry', 'date'];
const scores = [85, 90, 78, 92, 88];
const arr = [1, 2, 3];
const result = arr.map((num, index) => num * index);
console.log(result);
groupBy
関数を実装しなさい。const people = [
{ name: '太郎', age: 25 },
{ name: '花子', age: 30 },
{ name: '次郎', age: 25 }
];
const grouped = groupBy(people, 'age'); /*
結果: { '25':
[
{ name: '太郎', age: 25 },
{ name: '次郎', age: 25 }
],
'30': [
{ name: '花子', age: 30 }
]
} */
flatten
関数を再帰的に実装しなさい(任意の深さに対応)。const nested = [
1, [
2, [
3, [
4
]
],
5]
];
const flat = flatten(nested); console.log(flat); // [1, 2, 3, 4, 5]
chunk
関数を実装しなさい。javascript const array = [1, 2, 3, 4, 5, 6, 7];
const chunked = chunk(array, 3); console.log(chunked); // [[1, 2, 3], [4, 5, 6], [7]]
const doubled = numbers.map(n => n * 2);
const strings = mixed.filter(item => typeof item === 'string');
[10, 20, 30]
const arr = [10, 20, 30];
arr.forEach(num => {
num = num * 2;
});
console.log(arr); // [10, 20, 30]と表示される。
// forEach内のnumは新しい変数であり、元の配列arrには影響しない。
const result = numbers
.filter(n => n % 2 === 0)
.map(n => n * 3)
.reduce((sum, n) => sum + n, 0);
const names = people
.filter(person => person.age >= 30)
.map(person => person.name);
const arr1 = [1, 2, 3];
const arr2 = [2, 3, 4, 5];
const combined = [...new Set([...arr1, ...arr2])];
const fruits = ['apple', 'banana', 'cherry', 'date'];
fruits.sort((a, b) => a.length - b.length);
const scores = [85, 90, 78, 92, 88];
const average = scores.reduce((sum, score) => sum + score, 0) / scores.length;
[0, 2, 6]
const arr = [1, 2, 3];
const result = arr.map((num, index) => num * index);
console.log(result); // [0, 2, 6]が出力されます。
// mapメソッドは配列の各要素に対して関数を適用し、新しい配列を生成します。
groupBy
関数function groupBy(array, key) {
return array.reduce((acc, obj) => {
const groupKey = obj[key];
if (!acc[groupKey]) { acc[groupKey] = []; }
acc[groupKey].push(obj);
return acc;
}, {});
}
flatten
関数function flatten(arr) {
return arr.reduce((flat, toFlatten) => {
return flat.concat( Array.isArray(toFlatten) ? flatten(toFlatten) : toFlatten );
}, []);
}
chunk
関数javascript function chunk(array, size) {
return array.reduce((acc, _, i) => { if (i % size === 0) { acc.push(array.slice(i, i + size)); }
return acc; }, []);
}