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

配列内のすべての数値を割り切れる共通の約数を求める方法 - JavaScript

配列に含まれるすべての数値を余りなく割り切れる数を見つけたい場面は、実際の開発でもよくあります。この記事では、数値の配列を受け取り、その配列内の全要素を割り切れる共通の約数を返すJavaScript関数の作り方を、具体的なコードとともに解説します。


まず、次のような配列を例として考えてみましょう。

const arr = [4, 6, 34, 76, 78, 44, 34, 26, 88, 76, 42];

解決のアプローチ

この問題は、大きく分けて次の2ステップで解決できます。


ステップ1: 各要素ごとに、その値の半分(Math.floor(el / 2))から2まで順番に割り算を試し、割り切れる数(約数)をすべて配列に収集します。
ステップ2: map()で各要素の約数リストを一括生成し、続けてreduce()filter()を組み合わせることで、すべての要素に共通して含まれる約数だけを残します。


なお、このアルゴリズムでは1を除外しています。どのような整数でも必ず1で割り切れてしまうため、意味のある答えを得るために、ループ条件をnum > 1としている点がポイントです。


サンプルコード

const arr = [4, 6, 34, 76, 78, 44, 34, 26, 88, 76, 42];

// 1つの数値に対して、2以上かつ自身の半分以下の約数をすべて抽出する
const dividesAll = el => {
    const result = [];
    let num;
    for (num = Math.floor(el / 2); num > 1; num--) {
        if (el % num === 0) {
            result.push(num);
        }
    };
    return result;
};

// 各要素の約数リストを作成し、共通する約数だけに絞り込む
const dividesArray = arr => {
    return arr.map(dividesAll).reduce((acc, val) => {
        return acc.filter(el => val.includes(el));
    });
};

console.log(dividesArray(arr));

コードのポイント

dividesAll関数は、1つの数値が持つ約数(自身の半分以下で2以上のもの)を配列として返します。
dividesArray関数では、map()によって各要素の約数リストを生成した後、reduce()で前の要素との共通部分(積集合)を順に計算していきます。reduce()に初期値を渡していないため、最初の要素の約数リストが出発点になります。


実行結果

コンソールには次のように出力されます。

[ 2 ]

この結果から、サンプル配列のすべての要素(4, 6, 34, 76, 78, 44, 34, 26, 88, 76, 42)を余りなく割り切れるのは「2」だけであることが分かります。もし共通の約数が存在しない場合は、空の配列が返されるため、戻り値の長さをチェックすることで判定も可能です。

  1. JavaScript配列から一意の値(重複なし)を取得する方法

    JavaScriptの配列に含まれる重複した値を取り除き、一意の値(ユニークな値)だけを取得したい場合は、Setオブジェクトを使うのが最もシンプルで効率的な方法です。 Setは同じ値を1つしか格納できないデータ構造のため、配列をnew Set()に渡すだけで自動的に重複が排除されます。その後、スプレッド構文([...set])を使えば、簡単に元の配列形式へ戻すことができます。 サンプルコード 以下は、JavaScriptの配列からすべての一意の値を取得する実際のコード例です。 <!DOCTYPE html> <html lang=ja> <head> <

  2. JavaScriptでオブジェクトの値を取得する方法:Object.values()と_.values()の違いを解説

    JavaScriptにはObject.values()など、オブジェクトの値を取得するためのメソッドがいくつか用意されています。しかし、これらの標準メソッドでは値を取り出すまでの手順がやや長くなりがちです。そこで便利なのが、JavaScriptライブラリ「Underscore.js」が提供する_.values()メソッドです。このメソッドを使えば、forループを記述することなく、オブジェクトの値を直接取得できます。 Object.values()を使った例 まずは標準メソッドであるObject.values()を使った例です。このメソッドで取得した値を順番に表示するには、for...ofループ