1つの問題:
文字列(str
)を処理して、括弧で囲まれた数字(と一致する)が配列( )rgx
の適切な場所から取得された値に置き換えられるようにします。sub
var rgx = /\((\d+)\)/,
str = "this (0) a (1) sentence",
sub = [
"is",
"test"
],
result;
上で宣言された変数が与えられたresult
場合、は「これはテスト文です」である必要があります。
2つの解決策:
これは動作します:
var mch,
parsed = '',
remainder = str;
while (mch = rgx.exec(remainder)) { // Not JSLint approved.
parsed += remainder.substring(0, mch.index) + sub[mch[1]];
remainder = remainder.substring(mch.index + mch[0].length);
}
result = (parsed) ? parsed + remainder : str;
しかし、次のコードの方が速いと思いました。変数が少なく、はるかに簡潔で、無名関数式(またはラムダ)を使用します。
result = str.replace(rgx, function() {
return sub[arguments[1]];
});
これも機能しますが、速度については間違っていました。 Chromeでは、驚くほど遅くなります(〜50%、前回チェックしたとき)!
..。
3つの質問:
- このプロセスがChromeで遅く、(たとえば)Firefoxで速く見えるのはなぜですか?
- より大きな文字列または配列が与えられた場合、メソッドがループ
replace()
と比較して高速になる可能性はありますか?そうでない場合、コードゴルフwhile()
以外のメリットは何ですか? - このプロセスを最適化して、機能的な2番目のアプローチと同じくらい効率的かつ手間のかからない方法はありますか?
これらのプロセスの背後で何が起こっているのかについての洞察を歓迎します。
..。
[記録のために:「ラムダ」および/または「機能的」という言葉の使用について声をかけられてうれしいです。私はまだ概念について学んでいるので、私が話していることを正確に知っていると思い込まないでください。ここで用語を誤用している場合は、遠慮なく訂正してください。]