Stringクラスに対する拡張(3)

toQueryParamsメソッド

【抜粋】
  toQueryParams: function() {
    var pairs = this.match(/^\??(.*)$/)[1].split('&');
    return pairs.inject({}, function(params, pairString) {
      var pair = pairString.split('=');
      params[pair[0]] = pair[1];
      return params;
    });
  },

まず、文字列(this)をクエリ文字列とみなし、先頭「?」より以降*1の文字列を「&」で分割して配列に格納します。injectメソッドはArrayクラスの追加メソッド*2です。第二引数の関数の第二引数(pairString)に配列の各要素の値が入ります。処理の結果を第一引数(params)に格納して返却します。これを繰り返し、最終的な結果を格納したもの(params)を返却します。injectの第一引数*3は返却値の初期値です。

つまりここでは、配列の各要素の「name=value」のnameをインデックス、valueを値としたカスタムオブジェクトが返却されることになります。

【例】
var obj = "?hl=ja&q=prototype.js%E8%A7%A3%E8%AA%AD&lr=".toQueryParams();
alert(Object.inspect($H(obj)));
//Hashオブジェクトに変換後、Object.inspectで文字列化して表示。
//#<Hash:{'hl': 'ja', 'q': 'prototype.js%E8%A7%A3%E8%AA%AD', 'lr': ''}>
//と表示される。

toArrayメソッド

【抜粋】
  toArray: function() {
    return this.split('');
  },

文字列(this)を、split*4で1文字ずつ配列に格納して返却します。区切り文字列に空文字列を指定することで1文字ずつに分割します。

【例】
var ary = "1文字ずつに分割します。".toArray();
alert(Object.inspect(ary));
//['1', '文', '字', 'ず', 'つ', 'に', '分', '割', 'し', 'ま', 'す', '。']
//と表示される。

camelizeメソッド

【抜粋】
  camelize: function() {
    var oStringList = this.split('-');
    if (oStringList.length == 1) return oStringList[0];

    var camelizedString = this.indexOf('-') == 0
      ? oStringList[0].charAt(0).toUpperCase() + oStringList[0].substring(1)
      : oStringList[0];

    for (var i = 1, len = oStringList.length; i < len; i++) {
      var s = oStringList[i];
      camelizedString += s.charAt(0).toUpperCase() + s.substring(1);
    }

    return camelizedString;
  },

文字列(this)が「aaa-bbb」形式であるとき、「aaaBbb」形式に変換して返却します。CSSプロパティをオブジェクトモデル構文に変換する場合に便利です。実際、後述するElementオブジェクトのgetStyleメソッドで使用されています。

基礎的な関数しか使っていないので処理の説明は省きます^^; ちょっと分かりにくい部分があるとすれば、以下でしょうか。

【抜粋】
    var camelizedString = this.indexOf('-') == 0
      ? oStringList[0].charAt(0).toUpperCase() + oStringList[0].substring(1)
      : oStringList[0];

これは条件演算子*5ですね。

inspectメソッド

【抜粋】
  inspect: function() {
    return "'" + this.replace('\\', '\\\\').replace("'", '\\\'') + "'";
  }

文字列(this)をシングルクォート「'」で囲み、文字列中の「\」を「\\」に、「'」を「\'」に変換して返却します。文字列リテラルの「\」は「\\」で表現され、シングルクォート「'」で囲まれた文字列リテラル中の「'」は「\'」で表現されます。

2006/10/24 追記。複数の置換ができない不具合があります。v1.5.0_rc0では改善されています。

【参考】
  inspect: function() {
    return "'" + this.replace(/\\/g, '\\\\').replace(/'/g, '\\\'') + "'";
  }

前述Object.inspectメソッド(Objectクラスの固有メソッド)経由でアクセスされることが前提です。

parseQueryメソッド

String.prototype.parseQuery = String.prototype.toQueryParams;

toQueryParamsメソッドの別名定義です。

*1:「?」はなくても可

*2:Enumerableクラスからの継承メソッド

*3:「{}」は「new Array()」と同じです。

*4:Arrayクラスの既存メソッド

*5:条件式 ? a : b