【JavaScript】配列内の重複した数値を1つの場所にまとめて合計する方法
今回は、数値の配列を受け取り、同じ値を持つ要素をすべて最初に出現した位置にまとめて合計するJavaScript関数を作成します。
例えば、次のような入力配列があったとします。
const arr = [20, 10, 15, 20, 15, 10];
この場合、20が2つ、10が2つ、15が2つ存在するため、それぞれを合計すると、期待される出力は以下のようになります。
const output = [40, 20, 30];
実装の考え方
この問題を解くためには、各要素について「自分自身と同じ値が配列内の他の場所にまだ残っているか」を確認し、あればその要素を現在の位置に加算して削除する、という処理を繰り返すのがシンプルなアプローチです。
具体的には、lastIndexOf()メソッドを使うことで、同じ値の最後の出現位置を簡単に取得できます。現在のインデックスと最後の出現位置が異なる限り、ループを続けて値を合算していきます。
サンプルコード
実際のコードは次のとおりです。
const arr = [20, 10, 15, 20, 15, 10];
const addSimilar = arr => {
for(let i = 0; i < arr.length; i++){
while(i !== arr.lastIndexOf(arr[i])){
const ind = arr.lastIndexOf(arr[i]);
arr[i] += arr.splice(ind, 1)[0];
};
};
};
addSimilar(arr);
console.log(arr);コードの解説
- 外側の
forループで配列の各要素を順番に走査します。 - 内側の
whileループでは、lastIndexOf(arr[i])の結果が現在のインデックスiと一致しない間(=同じ値が後方にも存在する間)、処理を繰り返します。 splice(ind, 1)によって同じ値の要素を配列から取り除き、その戻り値(取り除かれた要素)を現在の位置の要素に加算しています。- これにより、同じ値はすべて最初に出現したインデックスに集約され、配列から重複がなくなった時点で
whileループが終了します。
出力結果
このコードをコンソールで実行すると、次の出力が得られます。
[ 40, 20, 30 ]
元の配列[20, 10, 15, 20, 15, 10]に対して、20どうし・10どうし・15どうしがそれぞれ合計され、重複のない配列[40, 20, 30]が正しく生成されていることが確認できます。
-
JavaScriptで1つの要素を除いた配列の合計(最小値・最大値)を求める方法
問題の概要次のような整数の配列があるとします。const arr = [12, 1, 4, 8, 5];ここで求められているのは、このような配列を唯一の引数として受け取るJavaScript関数の作成です。この関数は、正確に2つの整数からなる配列を返す必要があります。1つ目の整数: 配列の要素から任意の1つを除外した場合に得られる最小の合計2つ目の整数: 配列の要素から任意の1つを除外した場合に得られる最大の合計さらに重要な条件として、処理には forループを1回だけ 使用しなければなりません。期待される出力たとえば、上記の配列の場合、出力は次のようになります。const output = [
-
C言語で2次元配列の全要素の合計を計算する方法(実行時初期化)
問題実行時初期化(ランタイム初期化)を使用して、2次元配列のすべての要素の合計を計算するプログラムを作成します。2次元配列とは2次元配列は、表形式のデータを格納したい場合や、行列演算などの数学的処理を行うアプリケーションでよく使用されます。宣言の構文は以下の通りです。データ型 配列名 [行サイズ] [列サイズ];例えば、int a[4][4]; のように宣言します。この場合、配列の要素数は「行サイズ × 列サイズ」で求められ、4 × 4 = 16個となります。サンプルプログラム以下は、実行時初期化を使用して2次元配列のすべての要素を読み込み、偶数要素と奇数要素それぞれの合計を計算するC言語のプ