data-processing

配列、JSON、日付、正規表現 JavaScriptのデータ処理

前回は、関数自体の演算と状態を持つ関数である関数とクロージャについてまとめた。ここでは、配列、JSON処理、日付処理、正規表現 JavaScriptのデータ処理について解説する。

1 配列

配列は順序のある要素の集まりである。JavaScriptの配列の長さは可変である。なぜならJavaScriptの配列はオブジェクトだからである。

 

JavaScriptの配列

JavaScriptの配列はリテラル表記とnew式(後述)の2つの方法で生成できる。配列リテラルはブラケット([])の中に配列要素をカンマで区切って並べる。要素がない配列は長さゼロの配列である。要素には任意の値やオブジェクト参照を指定できる。

 

配列の要素アクセス

配列の要素のアクセスはブラケット演算子([]演算子)で行う。[]内には添字の数値を書く。添字は0から始まる。要素のない添字を指定するとundefined値になる。

 

配列の長さ

配列とドット演算子に続いてlengthを書くと配列の長さを得られる。配列の長さは配列の最後尾の要素のインデックスに1を足した数である。配列の長さの上限は2の32乗である。

 

配列の要素の列挙

配列の要素を列挙するにはfor文が一番よく使われる。

 

多次元配列

配列の要素には何でも指定できるので配列の指定もできる(多次元配列)。

 

配列はオブジェクト

JavaScriptの配列はオブジェクトである。内部的にはArrayオブジェクト(Arrayクラス)のインスタンスオブジェクトである。このためnew式でArrayコンストラクタを呼び出す配列生成も可能である。

 

Arrayクラス

Arrayクラスは配列オブジェクトのためのクラスである。

 

配列オブジェクトの意味

オブジェクトリテラル式で生成したオブジェクトは配列ではない。1つはlengthプロパティのenumerable属性属性で、もう1つの違いは配列のlengthプロパティ値の自動増分である。

 

配列のイディオム

  • ソート:sortメソッドで配列の要素値のソートができる。引数なしでsortメソッドを呼ぶと文字列としてソートする。文字列としてのソートはUnicodeのコードポイント値の大小比較である
  • 配列を使う文字列生成:pushとjoinを組み合わせた文字列生成は、部分文字列を配列にpushして最後にjoinで1つの文字列に連結する
  • 配列のコピー:concatメソッドもしくはsliceメソッドを使う
  • 要素の削除:delete演算を使う。削除した要素の部分を詰めた配列にするにはspliceメソッドを使う
  • フィルタ処理:forEachメソッドを使う

 

配列の内部

JavaScriptの配列の実体はオブジェクトなので素朴な実装では連続したメモリ領域にならない。JavaScript以外の多くの言語の配列は、暗黙に連続したメモリ領域を意味する。この暗黙の内部実装で、効率的なメモリ使用と高速な要素アクセスが期待できる。

 

配列風のオブジェクト

JavaScriptには配列ではない配列風オブジェクトが存在する。有名なのは関数の実引数にアクセスできるargumentsオブジェクトである。DOMのAPIには配列風のオブジェクトが多くある。

 

イテレータ

イテレータは繰り返しのみに働きを特化したオブジェクトである。細部を切り捨て、ある働きのみに機能を限定することを抽象化と呼ぶ。イテレータは繰り返しを抽象化した言語機能である。

 

ジェネレータ

ジェネレータはイテレータと同じくJavaScript独自拡張で、繰り返しのための言語機能である。ジェネレータは見た目は普通の関数である。ジェネレータと普通の関数の違いは内部でyield呼び出しをしているか否かのみである。

 

配列の内包

配列の内包(Array Comprehensions)はジェネレータで配列を生成できる機能である。これもJavaScript独自拡張である。

 

2 JSON

JSON(JavaScript Object Notation)はJavaScriptのリテラル表記をベースにしたデータフォーマット形式である。RFC4627が仕様である。JSONは4つの基本型と2つの構造化型を表現可能である。基本型は文字列値型、数値型、ブーリアン型、null型の4つの型である。構造化型はオブジェクトと配列の2つの型である。

 

JSON文字列

現実のプログラミングで多い操作は、JSONフォーマット形式の文字列(以後JSON文字列と呼ぶ)とJavaScriptオブジェクトの間の相互変換である。

  • JSON文字列のパース:代表的な実装はjson2.js

 

JSONオブジェクト

JSONオブジェクトはネイティブJSONを扱うオブジェクトである。コンストラクタ呼び出しはできない。

 

3 日付処理

Dateクラスは日付時刻を操作するクラスである。内部的には、時刻は基準時からの経過ミリ秒の整数で表現する。基準時はGMTの1970年1月1日の0時0分である。この基準時をepoch(エポック)と呼ぶことから、基準時からの経過時間をエポックミリ秒あるいはエポック値と呼ぶ。日付処理は極論すると以下の4つの形式の間の相互変換にまとめられる。

  • エポック値:データベースの格納値。相互変換のハブ。経過時間の計算
  • Dateクラス:JavaScriptコードでの内部表現。月処理、週処理、曜日判定
  • 文字列:利用者への表示用(和暦など)。利用者からの入力値。ネットワーク交換用
  • 年月日などの数値:利用者への表示用。利用者からの入力値

 

Dateクラス

Dateクラスの関数またはコンストラクタ呼び出し、プロパティまとめ。

 

4 正規表現

正規表現とは

正規表現(regular expression)は文字列のパターンマッチングに特化した言語である。しばしばregex(レジックス)と省略表記する。JavaScriptで正規表現を使うには正規表現オブジェクトを使う。

正規表現は言語の一種だが、JavaScriptのような汎用プログラミング言語ではなく、用途を特化した言語である。用途を特化したプログラミング言語をDSL(Domain Specific Language)と呼ぶ。正規表現の主な応用分野は検索(search)と置換(replace)である。

  • 正規表現の解法:パターンマッチングという問題に対して、パターンを記述する記法(言語)を用意して対象文字列とパターンを正規表現エンジンに渡して探させる

 

正規表現の用語

  • パターン(pattern):探したい規則
  • 入力シーケンス:パターンを探す対象文字列
  • マッチ(match):入力シーケンスの中でパターンに一致する文字列が見つかること

 

正規表現の文法

パターン文字列の構成要素はメタ文字とリテラル文字に分けられる。正規表現のリテラル文字はパターンの中に書いた文字がそのままの文字として解釈される。

 

JavaScriptの正規表現

JavaScriptで正規表現を扱うには正規表現オブジェクトを使う。正規表現オブジェクトはRegExpクラスのインスタンスオブジェクトである。

 

正規表現プログラミング

  • testメソッドとexecメソッド:testメソッドは入力シーケンスにパターンがマッチすれば真を返し、マッチしなければ偽を返す。execメソッドは入力シーケンスにパターンがマッチすれば結果オブジェクト(配列)を返す。マッチしなければnull値を返す
  • execメソッドの返り値:マッチの結果を示す配列。配列の0番目の要素が入力シーケンスの中で最初にマッチした文字列で、配列の1番目以降の要素がグループ前方参照の部分文字列

 

文字列オブジェクトと正規表現オブジェクト

Stringオブジェクトに正規表現オブジェクトを引数にとるメソッドがいくつかある。例えば、match(regexp)、replace(searchValue, replaceValue)などである。

 

最後に

配列は順序のある要素の集まり。JSONはJavaScriptのリテラル表記をベースにしたデータフォーマット形式。日付処理はDateクラスを使う。正規表現は文字列のパターンマッチングに特化した言語であり、主な応用分野は検索と置換である。

次回は、開発、実行、デバッグ手法などクライアントサイドJavaScriptとHTMLについて解説する。

パーフェクトJavaScript (PERFECT SERIES 4)


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>