JavaScriptの配列から奇偶が異なる唯一の要素を返す方法
問題の概要
整数の配列 arr を第1引数(かつ唯一の引数)として受け取るJavaScript関数を作成します。
この配列には、「すべて偶数+奇数が1個だけ」または「すべて奇数+偶数が1個だけ」という特徴があります。関数の役割は、その中で唯一ほかと性質が異なる要素を見つけ出し、それを返すことです。
たとえば、次のような入力が与えられた場合を考えてみましょう。
入力
const arr = [5, 9, 7, 11, 34, 23, 77];
出力
const output = 34;
出力の解説
この配列はほぼすべて奇数で構成されていますが、34 だけが偶数です。したがって、返すべき値は 34 となります。
実装コード
以下が実際のコード例です。
const arr = [5, 9, 7, 11, 34, 23, 77];
const findDifferent = (arr = []) => {
let { length: len } = arr, i;
const evens = []; // 偶数を格納する配列
const odds = []; // 奇数を格納する配列
for (i = 0; i < len; i++) {
// 偶数なら evens へ
if (arr[i] % 2 === 0) {
evens.push(arr[i]);
}
// 奇数なら odds へ
if (Math.abs(arr[i] % 2) === 1) {
odds.push(arr[i]);
}
}
// 数が多い方が主流のグループなので、少ない方の先頭要素が答え
if (evens.length > odds.length) {
return odds[0];
} else {
return evens[0];
}
};
console.log(findDifferent(arr)); // 34出力結果
34
コードのポイント解説
このアプローチの流れは以下の通りです。
- 配列を走査しながら、偶数は
evens、奇数はoddsに振り分けます。 - 問題の前提より、どちらか一方のグループには必ず1個しか要素がありません。つまり、要素数の多いグループが配列の「主流」であり、要素数が少ない方のグループに含まれる要素が求める答えになります。
特に注目したいのが Math.abs(arr[i] % 2) の部分です。JavaScriptでは負の数の剰余計算の結果が負になるため、たとえば -3 % 2 は -1 となります。Math.abs() で絶対値を取ることで、負の奇数も正しく判定できるようにしています。
filterを使った簡潔な別解
ES6以降のメソッドを使えば、同じ処理をもっと簡潔に書くこともできます。
const findDifferent = (arr = []) => {
const evens = arr.filter(n => n % 2 === 0);
const odds = arr.filter(n => n % 2 !== 0);
return evens.length === 1 ? evens[0] : odds[0];
};
console.log(findDifferent([5, 9, 7, 11, 34, 23, 77])); // 34
console.log(findDifferent([2, 4, 6, 8, 10, 15, 20])); // 15こちらの書き方は、偶数・奇数それぞれのグループを filter() で抽出し、長さが1のグループの要素をそのまま返すだけなので、意図が読み取りやすくバグも生まれにくくなります。用途や可読性の要件に応じて、両者の実装を使い分けるとよいでしょう。
-
【初心者向け】JavaScriptのArray.from()メソッドの使い方を実例で解説
JavaScript の Array.from() メソッドは、length プロパティを持つオブジェクト(配列風オブジェクト)や、文字列・Map・Set などの反復可能(イテラブル)なオブジェクトから、新しい Array オブジェクトを生成して返すためのメソッドです。元のオブジェクトは変更されず、常に新しい配列インスタンスが返されます。 基本構文 Array.from(obj, mapFunction, val) パラメータの説明 obj:配列へ変換したい対象のオブジェクト。配列風オブジェクト(length プロパティを持つもの)や反復可能なオブジェクトを指定します。 mapFunctio
-
JavaScriptのArray.from()メソッドとは?使い方と実例をわかりやすく解説
Array.from()メソッドは、配列風オブジェクト(array-like)や反復可能オブジェクト(iterable)から、新しい配列オブジェクトを作成するための便利なメソッドです。文字列、Map、Set、NodeListなど、さまざまなデータを手軽に配列へ変換できます。 Array.from()の基本的な動作 例えば、文字列「HelloWorld」に対してArray.from()を使用すると、1文字ずつ分割された新しい配列が生成されます。以下に実際のコード例を示します。 サンプルコード <!DOCTYPE html> <html lang="ja"&g