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];
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メソッドの別名定義です。