2016-07-27 4 views
1

でループしながら、私は私のコードでは、この文字列置換機能を実装しようとしていますを交換してくださいこの最後の置換機能は、検索式に2つ以上の文字を含むを使用できません。はindexOfのを使用して、すべてとString.prototype

私は本当にwhileループで最初の関数を使う必要があります。

最初の関数の問題点は誰にも分かりますか?このようなことが

// can't reassign `this` in String.prototype method ! 
this = this.replace(f,r) 

代わりに動作しませんので

+2

のためだけでなく、あなたがソートの実装では、 'String.prototype.replace'を使用して不正行為をしています。しかし、あなたは 'string.replace(/ find/g、 'replacement')'を使うことができます。 – naomik

+0

あなたの答えにタンク!私は/ gと/ giを使うことができることを知っています。実際、私のコードはreplace/gを使って既に動作しています。しかし、ある時点では、RegExpを使用して必要な機能を少し追加したいと思っていました。しかし、私たちが見たように、理由はありませんが、whileループは機能しませんでした。 – Yan

+0

私はもっと深い答えを – naomik

答えて

0
function(f,r) 
{ 
var str=this; 
if (f != r) { 
    while (str.indexOf(f) !== -1) { 
     str=str.replace(f,r); 
    } 
} 
return str.toString(); 
} 
1

文字列は、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' 

次に文字列にyxの単一のインスタンスを置き換えるために働く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" 
+0

以下に提供しました。ありがとうございました!私は 'String'が** Primitive Value **であることに注意を払っていなかったので、' Array'と 'Object'とは異なります。 – Yan

関連する問題