JavaScriptのsplice()で配列をその場で編集する:重複要素をn回以下に制限する方法
配列 arr と数値 n を引数に受け取り、各要素が n 回を超えて繰り返されないよう調整した配列を返す関数を作成してみましょう。ポイントは、残したい要素のインデックス(並び順)を崩さないことです。ここでは、JavaScript の splice() メソッドを使って配列をその場で直接書き換える方法を解説します。
アプローチ
まず、各要素の出現回数をハッシュマップ(プレーンなオブジェクト)で記録しながら、配列を先頭から順に走査します。走査中に、ある要素の出現回数が上限 n に達しているにもかかわらず再び現れた場合は、その場で splice() を呼び出して該当要素を削除します。これにより、新しい配列を作らずに元の配列を直接編集できます。
実装例
const arr = [7, 26, 21, 41, 43, 2, 26, 24, 10, 26, 10, 10, 24, 35, 35,
35, 43, 26, 41, 7, 24, 24, 21, 24, 10, 35, 10, 7, 24, 7, 35, 26, 41,
35, 2, 43, 24, 2, 41, 26, 41, 7, 7, 26, 2, 10, 43, 10, 35, 41, 24, 7,
2, 2, 7, 2, 26, 24, 26, 43, 43, 21, 10, 28, 10];
const array = [12, 4, 2, 12, 32, 21, 67, 4, 32, 5];
const deleteExtra = (arr, n) => {
const map = {};
for(let i = 0; i < arr.length; i++){
if(map[arr[i]]){
if(map[arr[i]] >= n){
arr.splice(i, 1);
i--;
}else{
map[arr[i]]++;
}
continue;
};
map[arr[i]] = 1;
}
};
deleteExtra(array, 1);
deleteExtra(arr, 2);
console.log(array);
console.log(arr);
コードのポイント
splice(i, 1):インデックスiの位置にある要素を1つ削除します。削除後は後続の要素が自動的に左へ詰められ、元の配列が直接変更されます。i--:要素を削除すると後続要素のインデックスが1つ手前にずれるため、ループ変数を減算することで、同じ位置に移動してきた次の要素も確実にチェックできます。continue:既に出現済みの要素に対しては、カウント更新または削除のみを行い、初回登録用のmap[arr[i]] = 1の処理をスキップします。
出力結果
コンソールには次のように出力されます。
[ 12, 4, 2, 32, 21, 67, 5 ] [ 7, 26, 21, 41, 43, 2, 26, 24, 10, 10, 24, 35, 35, 43, 41, 7, 21, 2, 28 ]
array では各要素が1回だけ残され、arr では各要素が最大2回まで残っていることが確認できます。このように splice() を活用すれば、フィルター済みの新しい配列を別途用意せずとも、条件に合わない要素だけを効率的に除去できます。ただし、大きな配列に対して頻繁に splice() を呼び出すと要素の詰め直しのコストが発生するため、パフォーマンスが重要な場面では filter() などで新しい配列を生成する方式との使い分けも検討しましょう。
-
【JavaScript】配列内のネストされたオブジェクトの値を合計する方法
この記事では、JavaScriptを使って、配列内にネストされた(入れ子構造の)オブジェクトの値を合計する方法を解説します。サンプルコードでは、JSONデータの複数階層に格納された数値(costNum)を順番に取り出し、その合計をブラウザ上に表示します。 コード例 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=d
-
JavaScriptのオブジェクト配列に配列メソッドを適用する方法
JavaScriptでは、オブジェクトが格納された配列に対しても、通常の配列と同じようにpop()、push()、splice()などの標準的な配列メソッドをそのまま使用できます。オブジェクト配列はあくまで「配列」であるため、要素としてオブジェクトが入っていても配列操作のAPIは共通で動作します。 コード例 以下は、JavaScriptオブジェクトの配列に対して配列メソッドを使用するサンプルコードです。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8