文字列は、JavaScriptで不変である、あなたはあなたの関数から新しい文字列を返す必要があり
String.prototype.replaceAll = function replaceAll(f,r) {
if (this.indexOf(f) === -1)
return this.toString()
else
return this.replace(f, r).replaceAll(f,r)
}
console.log('foobar foobar'.replaceAll('foo', 'hello')) // => 'hellobar hellobar'
console.log('foobar foobar'.replaceAll('o', 'x')) // => 'fxxbar fxxbar'
したがって、String.prototype.indexOf
やのような組み込み関数に頼ってもかまいません。
これらをゼロから実装したい場合は、非常に基本的なJavaScriptを使用できます。 while
ループを使用する必要はありません。あなたはです。ですが、…
私は実際にwhileループで最初の関数を使用する必要があります。
…偽です。
基本的なfind
機能から始めましょう。これは、単純な再帰関数
function replaceAll(s, x, y) {
var idx = find(s, x)
if (idx === -1)
return s
else
// use 4th parameter in replace function so index isn't recalculated
return replaceAll(replace(s, x, y, idx), x, y)
}
console.log(replaceAll('foobar foobar', 'foo', 'hello')) // => 'hellobar hellobar'
console.log(replaceAll('foobar foobar', 'o', 'x') ) // => 'fxxbar fxxbar'
にあるその後
String.prototype.indexOf
function find(s, x) {
function loop(s, pos) {
if (s.substring(0, x.length) === x)
return pos
else if (s === '')
return -1
else
return loop(s.substring(1), pos + 1)
}
return loop(s, 0)
}
console.log(find('foobar', 'f')) // => 0
console.log(find('foobar', 'bar')) // => 3
console.log(find('foobar', 'x')) // => -1
console.log(find('foobar', '')) // => 0
replaceAll
を実施し、s
function replace(s, x, y, idx) {
// idx is an optional parameter here for optimizing replaceAll
// you'll see it used in the next example
if (idx === undefined)
return replace(s, x, y, find(s, x))
else if (idx === -1)
return s
else
return s.substring(0, idx) + y + s.substring(idx + x.length)
}
console.log(replace('foobar', 'foo', 'hello')) // => 'hellobar'
console.log(replace('foobar', 'bar', 'hello')) // => 'foohello'
次に文字列にy
でx
の単一のインスタンスを置き換えるために働くreplace
機能のように動作します
これらの機能はすべてString.prototype
に実装することができますので、'foobar'.replaceAll('o', 'x')
のようなものが動作します。
find
が気に入らない場合は、ネイティブString.prototype.indexOf
を使用できます。一方、あなたがこれを練習としてやっていて、それを最初から実装しようとしているのであれば、私がここで使ったString.prototype.substring
に依存しないようにすることさえできます。
また
、何が価値があるのは、ここにあなたのコードが正常に動作
String.prototype.replaceAll = function(f,r) {
return this.split(f).join(r);
};
'foobar foobar'.replaceAll('foo', 'hello')
// => "hellobar hellobar"
'foobar foobar'.split('foo').join('hello')
// => "hellobar hellobar"
のためだけでなく、あなたがソートの実装では、 'String.prototype.replace'を使用して不正行為をしています。しかし、あなたは 'string.replace(/ find/g、 'replacement')'を使うことができます。 – naomik
あなたの答えにタンク!私は/ gと/ giを使うことができることを知っています。実際、私のコードはreplace/gを使って既に動作しています。しかし、ある時点では、RegExpを使用して必要な機能を少し追加したいと思っていました。しかし、私たちが見たように、理由はありませんが、whileループは機能しませんでした。 – Yan
私はもっと深い答えを – naomik