JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

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のグループの要素をそのまま返すだけなので、意図が読み取りやすくバグも生まれにくくなります。用途や可読性の要件に応じて、両者の実装を使い分けるとよいでしょう。

  1. 【初心者向け】JavaScriptのArray.from()メソッドの使い方を実例で解説

    JavaScript の Array.from() メソッドは、length プロパティを持つオブジェクト(配列風オブジェクト)や、文字列・Map・Set などの反復可能(イテラブル)なオブジェクトから、新しい Array オブジェクトを生成して返すためのメソッドです。元のオブジェクトは変更されず、常に新しい配列インスタンスが返されます。 基本構文 Array.from(obj, mapFunction, val) パラメータの説明 obj:配列へ変換したい対象のオブジェクト。配列風オブジェクト(length プロパティを持つもの)や反復可能なオブジェクトを指定します。 mapFunctio

  2. JavaScriptのArray.from()メソッドとは?使い方と実例をわかりやすく解説

    Array.from()メソッドは、配列風オブジェクト(array-like)や反復可能オブジェクト(iterable)から、新しい配列オブジェクトを作成するための便利なメソッドです。文字列、Map、Set、NodeListなど、さまざまなデータを手軽に配列へ変換できます。 Array.from()の基本的な動作 例えば、文字列「HelloWorld」に対してArray.from()を使用すると、1文字ずつ分割された新しい配列が生成されます。以下に実際のコード例を示します。 サンプルコード <!DOCTYPE html> <html lang="ja"&g