JavaScriptには、開発者の間で2つの非常に強力で人気のある機能があります。分割と結合です。これらの2つの関数は、文字列と配列の両方のタイプを交換できます。つまり、配列を文字列にシリアル化でき、その逆も同様です。これら2つの機能を完全に再生できます。ここで興味深いアプリケーションをいくつか見てみましょう。まず、これらの2つの機能を紹介しましょう。
string.prototype.split(セパレーター、制限)
セパレーターは文字列を配列に分割し、オプションのパラメーター制限は生成された配列の最大長を定義します。
"85 @@ 86 @@ 53" .split( '@@'); // ['85'、 '86'、 '53']; "banana" .split(); //["バナナ"]; //( - )ピーター( - :)「社長、上院、家」.split( '、'、2); // ["大統領"、 "上院"] array.prototype.join(セパレーター)
オプションのパラメーターセパレーターは、配列を文字列に変換します。セパレーターが提供されていない場合、コンマはパラメーター値として使用されます(アレイのトストリング関数と同様)。
[「スラグ」、「カタツムリ」、「子犬の尾」]。 //「スラグとカタツムリと子犬の犬の尾」['巨人'、4、 'レンジャー'、1] .Join( ''); // "ジャイアンツ4レンジャー1" [1962,1989,2002,2010] .join();
ここにアプリケーションの一部があります。
交換
この単純な関数は、ネイティブの交換関数とは異なり、正規表現を使用せずにグローバルサブストリングとして置き換えることができます。
string.prototype.replaceall = function(find、find、find with){return this.split(find).jein(fate with); } "男と計画" .replaceall( 'the'、 'a'); //「男と計画」小さな文字列の場合、単一の文字に置き換えられたネイティブ関数よりも少し弱いです(ここでは、正規表現の2つの追加関数を指します)が、Mozillaの下では、文字が2または3文字を超える場合、この使用機能は正規表現よりも速く実行されます。
発生
この関数は、一致するサブストリングの数を取得できます。さらに、この種の機能は非常に直接的であり、規則性を必要としません。
string.prototype.occurences = function(find、matchcase){var text = this;マッチケース|| (find = find.tolowercase()、text = text.tolowercase()); text.split(find).length-1; } document.body.innerhtml.occurences( "div"); // Googleホームページには114Document.body.innerhtml.occurences( "/div")があります。 // Google Home Pageには57の「イングランドがエンジニアをエンゲージします」.occurrences( "eng"、true); // 2Repeatこの関数はprototype.jsから借用されています:
string.prototype.repeat = function(times){return new Array(times+1).join(this); } "go" .repeat(3) + "giants!"; //「GO GO GO GIANTS!」その美しさは、結合関数の使用にあります。焦点はこのセパレーターパラメーター値にあり、この基本配列には未定義の値の値のみが含まれています。これをより明確に説明するために、上記の例を再作成しましょう。
[未定義、未定義、未定義、未定義、未定義] .JOIN( "go") + "巨人
結合する前に、各配列要素は文字列に変換されることを忘れないでください(ここに空の文字列があります)。この繰り返し関数のアプリケーションは、配列リテラルを介して配列を定義する数少ない実行不可能なアプリケーションの1つです。
制限パラメーターを使用します
分割関数の制限オプションパラメーターを使用することはめったにありません。この制限を使用した例は次のとおりです。
var getDomain = function(url){return url.split( '/'、3).join( '/');} getdomain( "http://www.aneventapart.com/2010/seattle/slides/"); // "http://www.anev entapart.com "getDomain(" https://addons.mozilla.org/en-us/firefox/bookmarks/ "); //" https://addons.mozilla.org "数値メンバーを変更します
常連を混ぜると、参加して分割すると、アレイメンバーを簡単に変更できます。ただし、この機能は想像ほど難しくありません。その主な機能は、指定された配列の各メンバーの前で指定された文字列を削除することです。
var beadeadmembers = function(arr、removestr){var regex = regexp( "[、]?" + removestr); return arr.join()。split(regex).slice(1);} //飛行番号Beheadmembers(["ba015"、 "ba129"、 "ba130"]; // ["015"、 "129"、 "130"];残念ながら、この関数はIEで失敗します。なぜなら、最初の空のメンバーを誤って分割から削除するからです。次に、この機能を修正しましょう。
var beadeadmembers = function(arr、removestr){var regex = regexp( "[、]?" + removestr); var result = arr.join()。split(regex); return result [0] && result || result.slice(1); //つまり回避策}emaScript 5の配列のマップ関数の代わりにこの手法を使用するのはなぜですか?
["BA015"、 "BA129"、 "BA130"]。マップ(function(e){return e.Replace( 'ba'、 '')}); // ["015"、 "129"、 "130"]]実際の使用では、実行可能な場合、私は通常、ネイティブマップ関数を使用します(IE <9以下では利用できません)。次の例は学習ツールとしてのみ使用されますが、結合と分割の呼び出しの構文がより簡潔で直接的であることは注目に値します。最も興味深いことに、特にFFとSafariでより効率的な小さなアレイでは、非常に効率的です。大きな配列の場合、マップ関数がより適しています。 (すべてのブラウザで)、関数を結合および分割するための関数呼び出しが少なくなります。
// test 1-join/splitvar arr = []、x = 1000; while(x--){arr.push( "ba" + x);} var beheadmembers = function(arr、regex){return arr.join()。 1000; while(y-){beheadmembers(arr、regex);}; +new date-timer; // ff 3.6 733ms // ch 7 464ms // sa 5 701ms // ie 8 1256ms //テスト2-ネイティブマップ機能arr = []、x = 1000;日付、y = 1000; while(y-){arr.map(function(e){return e.replace( 'ba'、 '')});}+new date-Timer; // ff 3.6 2051ms // cr 7 732ms // sf 5 1520ms // IE 8(IE 8(パターンマッチング
配列は常にパターンマッチングを実行する必要がありますが、文字列は常に実行しません。正規表現は文字列で使用できますが、配列では使用できません。パターンマッチングのために配列を文字列に変換する力は、この記事の範囲をはるかに超えています。簡単なアプリケーションを見てみましょう。
レースのレース結果を配列に保存する必要があると仮定します。目的は、出場者とその録音時間を交互に配列に配置することです。結合式と正規表現を使用して、このストレージパターンが正しいかどうかを確認できます。次のコードは、2つの連続した名前を探すことで、逃したレコードタイムを見つけるためです。
var results = ['sunil'、'23:09 '、' bob '、'22:09'、 'carlos'、 'mary'、'22:59 ']; var baddata = results.join('、 ')。 // ["カルロス、メアリー"]