2017-03-20 15 views
0

私は様々な異なるstring.insert(i, s)関数を試しましたが、私は持っているループではうまくいきませんでした。私のコードの例を次に示します。ループで動作する別の文字列の特定の場所に文字列を挿入するにはどうすればよいですか?

var str = " absolutely pie"; 
var indices = [0, 12, 16]; // indices where I want to insert 
var things = ["I", "love", 1]; // things I want to insert 
for(var i = 0; i < indices.length; i++) { 
    str = str.splice(indices[i], 0, things[i]); 
} 

これは機能しません。 「私は絶対にPIE1を愛し」プリントアウトすることになって、代わりにそれはプリントアウトしています:

あなたはコードhereを見ることができます

を「私はパイをabsolutellove1y」。

ほとんどの例をthis質問から試しました。

問題は何ですか(挿入方法はどのように実装されていますか)。これをどのように修正できますか?

答えて

0

stringにすでに追加されているthingsの数を、それぞれのインデックスにiを追加することで考慮する必要があります。また、元のstringの冒頭に余白が1つあります。 ' absolutely pie'の代わりに' absolutely pie'にする必要があります。

は配列でしか機能しないため、文字列を(String#splitを使用して)文字配列に変換してから、spliceを呼び出すようにしてください。この配列をArray#joinを使って文字列に戻すことができます。

var string = ' absolutely pie' 
 
var indices = [0, 12, 16] 
 
var things = ['I', 'love', 1] 
 

 
string = string.split('') 
 

 
things.forEach(function (e, i) { 
 
    string.splice(indices[i] + i, 0, e) 
 
}) 
 

 
string = string.join('') 
 

 
console.log(string) //=> 'I absolutely love pie1'

0

だからあなたの問題は、あなたがで始まるインデックスが元の文字列に対して相対的であるということです。挿入インデックス16で「1は、」最初は意味がありますが、あなたがしたい、実際の指数は、ここで簡単に修正がオフセットを追加することである21であるので、あなたが5つの以上の文字を追加します。

var str = " absolutely pie"; 
var indices = [0, 12, 16]; // indices where I want to insert 
var things = ["I", "love", "1"]; // things I want to insert 
var offset = 0; 
for(var i = 0; i < indices.length; i++) { 
    str = str.splice(indices[i] + offset, 0, things[i]); 
    offset += things[i].length 
} 

他の問題があることですあなたのターゲットが"I absolutely love pie1"の場合は、元の文字列のスペースを置き換えるケースの一部と、そうでないもののスペースを置き換えます。 delCountパラメータの1で機能をテストすると、​​が得られました。 "絶対的に"と "パイ"の間に余分な "置き換えスペース"が必要です。または、それを最初から削除し、代わりにdelCountとして0を渡します。

0

元の文字列に基づいてインデックスを計算していますが、その変更を考慮する必要があります。ループが進むにつれて大きくなります。

単純にindices配列を変更します。

var indices = [0, 14, 22]; // indices where I want to insert 
+0

これは結構ですが、なぜコードにそれを放置しないで 'thing'以前の長さを追加することによって、(手でそれぞれの新しい指標を算出する必要が? – xavdid

関連する問題