441


75

文字列があります。「Hello world」としましょう。インデックス3のcharを置き換える必要があります。 インデックスを指定してcharを置き換える方法はありますか

var str = "こんにちは世界";

私は何かが必要です

str.replaceAt(0、 "h");

20 Answer


504


JavaScriptでは、文字列は*不変*です。つまり、変更した内容で新しい文字列を作成し、それを指す変数を割り当てることが最善の方法です。

あなたは `replaceAt()`関数をあなた自身が定義する必要があります:

String.prototype.replaceAt = function(index、replacement){this.substr(0、index)を返します。replacement this.substr(index replacement.length)を返します。 }

そしてそれを次のように使います。

var hello = "Hello World"; alert(hello.replaceAt(2、 "!!")); // Heを表示するべきです!! o World


75


JavaScriptには `replaceAt`関数はありません。 次のコードを使用して、指定した位置にある任意の文字列の任意の文字を置き換えることができます。

function rep() {
    var str = 'Hello World';
    str = setCharAt(str,4,'a');
    alert(str);
}

function setCharAt(str,index,chr) {
    if(index > str.length-1) return str;
    return str.substr(0,index) + chr + str.substr(index+1);
}
click


52


できません。 位置の前後の文字を取り、新しい文字列に連結します。

var s = "ハローワールド"; var index = 3; s = s.substr(0、index) 'x' sstr(index 1);


29


ここにはたくさんの答えがあり、それらはすべて2つの方法に基づいています。

  • 方法1:2つの部分文字列を使用して文字列を分割し、それらの間に文字を入れます

  • 方法2:文字列を文字配列に変換し、1つの配列メンバーを置き換えて結合する

個人的には、これら2つの方法を異なる場合に使用します。 説明させてください。

@FabioPhms:あなたの方法は私が最初に使ったもので、たくさんの文字を含む文字列では悪いことが怖かったです。 しかし、質問は何文字ですか? 私は10の「loremイプサム」パラグラフでそれをテストしました、そしてそれは数ミリ秒かかりました。 それから私はそれを10倍大きい弦でテストしました - それほど大きな違いはありませんでした。 ふむ。

@ vsync、@ Cory Mawhorter:あなたのコメントは明白です。しかし、やはり、大きな文字列は何ですか? 私は32 …​ 100kbのパフォーマンスではより良くなるべきであり、文字置換のこの1つの操作のためにsubstring-variantを使うべきであることに同意します。

しかし、私がかなりの数の交換をしなければならない場合はどうなりますか?

その場合のほうが速いかどうかを証明するために、私は自分のテストを実行する必要がありました。 1000文字からなる比較的短い文字列を操作するアルゴリズムがあるとしましょう。 平均して、その文字列の各文字は最大100回置き換えられると予想されます。 したがって、このようなものをテストするためのコードは次のとおりです。

var str = "... {大文字列はこちら} ... ";

(var i = 0; i <100000; i){var n = '' Math.floor(Math.random()* 10); var p = Math.floor(Math.random()* 1000); //位置* p *の文字* n *を置換する

私はこのためのフィドルを作成しました、そしてそれは ここです。 TEST1(部分文字列)とTEST2(配列変換)の2つのテストがあります。

結果:

  • TEST1:195ms

  • TEST2:6ミリ秒

配列変換は部分文字列を2桁上回ることになります。 だから - ここで何が起こったのでしょうか?

実際に起こることは、TEST2のすべての操作が、 `strarr2 [p] = n`のような代入式を使って、配列自体で行われることです。 代入は大きな文字列の部分文字列と比較して本当に速く、そしてそれが勝つつもりであることは明らかです。

それで、それは仕事のための正しいツールを選ぶことについてのすべてです。 再び。


28


ベクトルを使った作業は通常、Stringと連絡を取るのに最も効果的です。

私は以下の機能を提案します。

String.prototype.replaceAt = function(index、char){var a = this.split( ""); a [index] = char; a.join( "")を返します。 }

このスニペットを実行してください。

String.prototype.replaceAt=function(index, char) {
    var a = this.split("");
    a[index] = char;
    return a.join("");
}

var str = "hello world";
str = str.replaceAt(3, "#");

document.write(str);


25


Javascriptでは文字列は不変なので、次のようにしなければなりません。

var x = "Hello world" x = x.substring(0、i) 'h' x.substring(i 1);

iのxの文字を 'h’に置き換える


24


str = str.split( ''); str [3] = 'h'; str = str.join( '');


5


function dothis() {
  var x = document.getElementById("x").value;
  var index = document.getElementById("index").value;
  var text = document.getElementById("text").value;
  var arr = x.split("");
  arr.splice(index, 1, text);
  var result = arr.join("");
  document.getElementById('output').innerHTML = result;
  console.log(result);
}
dothis();
Run

この方法は、短い文字列には適していますが、大きなテキストには遅くなる可能性があります。

var x = "White Dog"; var arr = x.split( ""); // ["W"、 "h"、 "i"、 "t"、 "e"、 ""、 "D"、 "o"、 "g"] arr.splice(6、1、 'F') ; var result = arr.join( ""); // "白霧"

/ *ここで6は開始インデックス、1はいいえです。 削除する配列要素と最後の引数 'F'が挿入される新しい文字 * /


4


これは `Array.splice`に似た働きをします。

String.prototype.splice = function(i、j、str){return this.substr(0、i)str this.substr(j、this.length); ;


4


String.replaceをコールバックとともに使用するワンライナー(絵文字サポートなし):

// 0 - index to replace, 'f' - replacement string
'dog'.replace(/./ g、(c、i)=> i == 0? 'f':c)
// "fog"

説明:

//String.replace will call the callback on each pattern match
//in this case - each character
'dog'.replace(/./ g、関数(文字、インデックス){if(index == 0)//最初の文字を置き換えたい場合' f '文字を返す場合//他の文字は同じままにする}