JavaScriptで配列の先頭にあるゼロを削除する方法を解説
配列から先頭のゼロ(先行ゼロ)だけを取り除きたい場合、JavaScriptの filter() メソッドを使うとスマートに実装できます。この記事では、クロージャ(関数を返す関数)と組み合わせたテクニックを使って、配列の先頭に連続する0のみを削除し、途中や末尾にある0はそのまま残す方法を解説します。
処理の対象となる入力データ
以下のような配列が入力として与えられたとき、先頭に並んでいる0だけを削除することを目標とします。
[10, 0, 12, 0, 0] [0, 0, 0, 0, 0, 0, 10, 12, 0] [12, 0, 0, 1, 0, 0]
期待される結果は次のとおりです。
[10, 0, 12, 0, 0]→ 先頭に0がないためそのまま[10, 0, 12, 0, 0][0, 0, 0, 0, 0, 0, 10, 12, 0]→ 先頭の6つの0が削除され[10, 12, 0][12, 0, 0, 1, 0, 0]→ 先頭に0がないためそのまま[12, 0, 0, 1, 0, 0]
サンプルコード
ポイントは、filter() のコールバック内で「まだ有効な値が出現していない間」だけ0を除外する仕組みを作ることです。以下のコードでは、外側の関数が状態を保持する変数 lastValue を用意し、内側の関数が各要素を判定しています。
const removeLeadingZero = input => input.filter((lastValue => value => lastValue = lastValue || value)(false)); console.log(removeLeadingZero([10, 0, 12, 0, 0])); console.log(removeLeadingZero([0, 0, 0, 0, 0, 0, 10, 12, 0])); console.log(removeLeadingZero([12, 0, 0, 1, 0, 0]));
コードの仕組み
- 即時実行関数
(...)(false)によって、初期値falseを持つ変数lastValueが作られます。 - 各要素に対して
lastValue = lastValue || valueが評価されます。0は falsy な値なので、lastValueがfalseのうちは代入結果も0(falsy)となり、filter()によって除外されます。 - 最初の非ゼロの値が出現すると
lastValueが truthy になり、以降の要素(0を含む)はすべて条件を満たして配列に残ります。
プログラムの実行方法
上記のプログラムを実行するには、Node.js環境で次のコマンドを使用します。ここではファイル名を demo76.js として保存したものとします。
node demo76.js
実行結果
プログラムを実行すると、コンソールに以下の出力が表示されます。
PS C:\Users\Amit\JavaScript-code> node demo76.js [ 10, 0, 12, 0, 0 ] [ 10, 12, 0 ] [ 12, 0, 0, 1, 0, 0 ]
このように、filter() とクロージャを組み合わせることで、配列の先頭のゼロだけを効率的に削除できます。途中や末尾の0は保持されるため、数値列の正規化などにも応用できる便利なテクニックです。
-
【初心者向け】JavaScriptのreverse()メソッドで配列を逆順にする方法
JavaScriptのreverse()メソッドは、配列の要素を元の順序と逆順に入れ替えるための便利な関数です。このメソッドを呼び出すと、配列の最初の要素が最後に、最後の要素が最初に移動し、配列全体が反転されます。reverse()メソッドの基本reverse()は配列そのものを変更する「破壊的メソッド」である点に注意してください。つまり、元の配列の順序が直接書き換えられます。元の配列を保持したい場合は、あらかじめslice()やスプレッド構文([...arr])などでコピーを作成してからreverse()を使用するのがおすすめです。サンプルコード以下は、ボタンをクリックすると配列の要素が逆順
-
JavaScriptにおける配列の分割代入(Destructuring)の基本と使い方
分割代入(Destructuring)とは、配列から値を取り出して個別の変数に展開するための構文です。ES2015(ES6)で導入されたこの機能を使うと、配列の各要素を簡潔かつ読みやすく変数に割り当てることができます。 配列の分割代入のサンプルコード 以下は、JavaScriptで配列の分割代入を行うコード例です。 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <meta name="viewport&quo