teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

16

テキスト修正

2019/11/02 10:15

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -171,4 +171,8 @@
171
171
 
172
172
  > 置き換えたい文字列が全体に複数ある場合に対応するため、また、全体の文字列もある程度規則性があり、置換の開始位置はそうそう変わらないので
173
173
 
174
- とのことだったので、毎回、前方部分と後方部分を切り出して、置換後の文字列と連結するコードを書くのは煩わしい、ということはあると思うので、先に挙げた 、stackoverflow のベストアンサーに挙げられていた [spliceSlice()](https://stackoverflow.com/a/21350614) のような関数を自作して使い回すか、あるいは自作も不要な策として、追記3で挙げた、vocajsの[splice](https://vocajs.com/#splice) を使ってみることを検討してみてもよいかもしれません。
174
+ とのことだったので、毎回、前方部分と後方部分を切り出して、置換後の文字列と連結するコードを書くのは煩わしい、ということはあると思うので、先に挙げた 、stackoverflow のベストアンサーに挙げられていた [spliceSlice()](https://stackoverflow.com/a/21350614) のような関数を自作して使い回すか、あるいは自作も不要な策として、追記3で挙げた、vocajsの[splice](https://vocajs.com/#splice) を使ってみることを検討してみてもよいかもしれません。
175
+
176
+ 以下は、vocajsの[splice](https://vocajs.com/#splice) を使って `"Hello,World!"` の "World" を "Japan" に置き換える例です。
177
+
178
+ - A sample of using Voca JS's splice: [https://codepen.io/jun68ykt/pen/VwwyMev?editors=0012](https://codepen.io/jun68ykt/pen/VwwyMev?editors=0012)

15

テキスト修正

2019/11/02 10:14

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -140,4 +140,35 @@
140
140
  ```
141
141
  str.replace('World', 'Japan')
142
142
  ```
143
- をお勧めしたいと思います。
143
+ をお勧めしたいと思います。
144
+
145
+ ### 追記5
146
+
147
+ 質問への追記・修正、ベストアンサー選択の依頼へのコメントに、Y.NINOMIYAさんからのコメントで
148
+
149
+ > Y.NINOMIYA 2019/11/01 22:18
150
+ 置き換えたい文字列が全体に複数ある場合に対応するため、また、全体の文字列もある程度規則性があり、置換の開始位置はそうそう変わらないので「文字列の◯番目から△番目を置換する」という方法を取りたかったのです。
151
+
152
+ とありましたので、これをふまえて元のご質問にある
153
+
154
+ > そもそものそのような関数はないのでしょうか。最初は指定箇所以外を切り取って別で連結させる方法をとっっていたのですが非効率な気がし、やり方を調べていて今に至った形です。
155
+
156
+ に返答します。
157
+
158
+ > 非効率な気がし
159
+
160
+ とのことですが、「文字列の◯番目から△番目を置換する」方法として、Y.NINOMIYA さんがお書きになった
161
+
162
+ ```javascript
163
+ var str = "Hello,World!";
164
+ var str_1 = str.substr(0, 6) //"Hello"を切り出し
165
+ var str_2 = str.substr(11, 1); //"!"を切り出し
166
+ str = str_1 + "Japan" + str_2;
167
+ ```
168
+ というコードが、アルゴリズムとして、特段、効率が悪いことをやっている、ということはないと思います。
169
+
170
+ ただ、
171
+
172
+ > 置き換えたい文字列が全体に複数ある場合に対応するため、また、全体の文字列もある程度規則性があり、置換の開始位置はそうそう変わらないので
173
+
174
+ とのことだったので、毎回、前方部分と後方部分を切り出して、置換後の文字列と連結するコードを書くのは煩わしい、ということはあると思うので、先に挙げた 、stackoverflow のベストアンサーに挙げられていた [spliceSlice()](https://stackoverflow.com/a/21350614) のような関数を自作して使い回すか、あるいは自作も不要な策として、追記3で挙げた、vocajsの[splice](https://vocajs.com/#splice) を使ってみることを検討してみてもよいかもしれません。

14

テキスト修正

2019/11/02 03:40

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -127,11 +127,11 @@
127
127
  - **動作確認用CodePen: ** [https://codepen.io/jun68ykt/pen/NWWwJYW?editors=0012](https://codepen.io/jun68ykt/pen/NWWwJYW?editors=0012)
128
128
 
129
129
 
130
- とはいえ、Y.NINOMIYAさんとしては
130
+ Y.NINOMIYAさんとしては
131
131
 
132
132
  > 文字列の◯番目から△番目を他の文字列に置換
133
133
 
134
- するというやり方にこだわりがおありで、文字列に対して、 Array の[splice](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/splice) のような操作をする効率的なやり方をお求めなのか、または、 `"World"` を `"Japan"` に置き換えることが主目的なので、
134
+ するというやり方にこだわりがおありで、文字列に対して、 Array の[splice](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/splice) のような操作をするときの効率的なやり方をお求めなのか、または、 `"World"` を `"Japan"` に置き換えることが主目的なので、
135
135
 
136
136
  > 文字列の◯番目から△番目を他の文字列に置換
137
137
 

13

テキスト修正

2019/11/01 07:19

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -82,4 +82,62 @@
82
82
 
83
83
  - [https://github.com/panzerdp/voca/blob/master/src/manipulate/splice.js#L44](https://github.com/panzerdp/voca/blob/master/src/manipulate/splice.js#L44)
84
84
 
85
- のように、やっていることは、先の `spliceSlice` と基本的には同じでした。
85
+ のように、やっていることは、先の `spliceSlice` と基本的には同じでした。
86
+
87
+
88
+ ### 追記4
89
+
90
+ 質問への追記・修正、ベストアンサー選択の依頼へのY.NINOMIYAさんの以下のコメント
91
+
92
+ > Y.NINOMIYA 2019/11/01 13:03
93
+ var str = "Hello,World!";
94
+ console.log(str);
95
+ var str_1 = str.substr(0, 6) //"Hello"を切り出し
96
+ var str_2 = str.substr(11, 1); //"!"を切り出し
97
+ str = str_1 + "Japan" + str_2;
98
+ console.log(str); //“Hello,Japan!”と出力
99
+ このような形でやっていました
100
+
101
+ を拝読したので、追記します。
102
+
103
+ - 文字列 `var str = "Hello,World!"` に含まれる部分文字列 `"World"` を `"Japan"` に置き換えて、 `"Hello,Japan!"` という文字列を得たい。
104
+
105
+ ということが課題であるとすると、この課題を解決するための手段として、ご質問にある
106
+
107
+ > 文字列の◯番目から△番目を他の文字列に置換
108
+
109
+ するという方法を選ぶこと自体が非効率かもしれません。(この場合の「非効率」とは「わざわざ面倒なやり方をしている」ぐらいの意味です。)
110
+
111
+ なぜなら
112
+
113
+ ```javascript
114
+ var str_1 = str.substr(0, 6);
115
+ var str_2 = str.substr(11, 1);
116
+ ```
117
+
118
+ というコードを書こうとすると、`6` や `11` という数を得るために `World` の直前と直後のインデクスを目視で数えなければならないからです。そのようなことをしなくても、 `var str = "Hello,World!"` に含まれる`"World"` を `"Japan"` に置き換えるには、 [replace](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/replace)を使って、以下で済みます。
119
+
120
+ ```javascript
121
+ var str = "Hello,World!";
122
+
123
+ str = str.replace('World', 'Japan');
124
+
125
+ console.log(str);
126
+ ```
127
+ - **動作確認用CodePen: ** [https://codepen.io/jun68ykt/pen/NWWwJYW?editors=0012](https://codepen.io/jun68ykt/pen/NWWwJYW?editors=0012)
128
+
129
+
130
+ とはいえ、Y.NINOMIYAさんとしては
131
+
132
+ > 文字列の◯番目から△番目を他の文字列に置換
133
+
134
+ するというやり方にこだわりがおありで、文字列に対して、 Array の[splice](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/splice) のような操作をする効率的なやり方をお求めなのか、または、 `"World"` を `"Japan"` に置き換えることが主目的なので、
135
+
136
+ > 文字列の◯番目から△番目を他の文字列に置換
137
+
138
+ するという方針も見直せる余地がおありなのかは、回答者には分からないところはありますが、`"World"` を `"Japan"` に置き換えたい、ということであれば、 `6` や `11` を使わなくて済む
139
+
140
+ ```
141
+ str.replace('World', 'Japan')
142
+ ```
143
+ をお勧めしたいと思います。

12

テキスト修正

2019/11/01 07:11

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -70,7 +70,7 @@
70
70
 
71
71
  ### 追記3
72
72
 
73
- 文字列を操作するための [vocajs](https://vocajs.com/) というライブラリがあります。[Githubのレポジトリ](https://github.com/panzerdp/voca)に現時点で、約2700のStarがついているので、それなりに支持されているようですが、このライブラリでは、 `splice` という名前でご要望のメソッドが、以下のように提供されています。
73
+ 文字列を操作するための [vocajs](https://vocajs.com/) というライブラリがあります。[Githubのレポジトリ](https://github.com/panzerdp/voca)に現時点で、約2700のStarがついているので、それなりに支持されているようですが、このライブラリでは、(先ほど "若干憚られる" と書いた) `splice` という名前でご要望のメソッドが、以下のように提供されています。
74
74
 
75
75
  > **v.splice**(subjectopt='', start, deleteCountopt=subject.length-start, toAddopt='') → {string}
76
76
  >

11

テキスト修正

2019/11/01 01:40

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  配列だと [splice()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/splice) というメソッドが、そのような働きをしますが、文字列の spliceメソッドは無いです。なので、どうやって代替するのがよいか?ということになりますが、以下の投稿をみつけました。
4
4
 
5
- - stackoverflow: [Is there a splice method for strings?](https://stackoverflow.com/questions/20817618/is-there-a-splice-method-for-strings)
5
+ - **stackoverflow:** [Is there a splice method for strings?](https://stackoverflow.com/questions/20817618/is-there-a-splice-method-for-strings)
6
6
 
7
7
  上記の質問への[ベストアンサー](https://stackoverflow.com/a/21350614) で挙げられている以下
8
8
 

10

テキスト修正

2019/11/01 00:49

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -70,10 +70,16 @@
70
70
 
71
71
  ### 追記3
72
72
 
73
- 文字列を操作するための [vocajs](https://vocajs.com/) というライブラリがあります。[Githubのレポジトリ](https://github.com/panzerdp/voca)に現時点で、約2700のStarがついているので、それなりに支持されているようですが、このライブラリでは、 [splice](https://vocajs.com/#splice) という名前でご要望のメソッドが提供されています。
73
+ 文字列を操作するための [vocajs](https://vocajs.com/) というライブラリがあります。[Githubのレポジトリ](https://github.com/panzerdp/voca)に現時点で、約2700のStarがついているので、それなりに支持されているようですが、このライブラリでは、 `splice` という名前でご要望のメソッドが、以下のように提供されています。
74
74
 
75
- そして、この vocajs splice のソースコードを見てみると、以下
75
+ > **v.splice**(subjectopt='', start, deleteCountopt=subject.length-start, toAddopt='') → {string}
76
+ >
77
+ > Changes subject by deleting deleteCount of characters starting at position start. Places a new string toAdd instead of deleted characters.
76
78
 
79
+ - Voca: The JavaScript string library [vocajs.com/#splice](https://vocajs.com/#splice)
80
+
81
+ この Voca の spliceメソッドのソースコードを見てみると、以下
82
+
77
83
  - [https://github.com/panzerdp/voca/blob/master/src/manipulate/splice.js#L44](https://github.com/panzerdp/voca/blob/master/src/manipulate/splice.js#L44)
78
84
 
79
85
  のように、やっていることは、先の `spliceSlice` と基本的には同じでした。

9

テキスト修正

2019/11/01 00:46

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -31,7 +31,7 @@
31
31
  ```
32
32
  とするのも一案として検討してよいかもしれません。
33
33
 
34
- ただし、R.Mizukamiさんからコメントでご指摘がありましたように、 `splice` をそのままメソッド名に使うのはふさわしくないので、仮に `replaceSubsequence` としておき、以下、その使用例です。
34
+ ただし、R.Mizukamiさんからコメントでご指摘がありましたように、 `splice` をそのままメソッド名に使うのは若干憚られるため、仮に `replaceSubsequence` としておき、以下、その使用例です。
35
35
 
36
36
  - **動作確認用 CodePen:** [https://codepen.io/jun68ykt/pen/yLLPKwM?editors=0011](https://codepen.io/jun68ykt/pen/yLLPKwM?editors=0011)
37
37
 

8

テキスト修正

2019/10/31 19:57

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -70,7 +70,7 @@
70
70
 
71
71
  ### 追記3
72
72
 
73
- 文字列を操作するための [vocajs](https://vocajs.com/) というライブラリがあります。Githubのレポジトリに現時点で、約2700のStarがついているので、それなりに支持されているようですが、このライブラリでは、 [splice](https://vocajs.com/#splice) という名前でご要望のメソッドが提供されています。
73
+ 文字列を操作するための [vocajs](https://vocajs.com/) というライブラリがあります。[Githubのレポジトリ](https://github.com/panzerdp/voca)に現時点で、約2700のStarがついているので、それなりに支持されているようですが、このライブラリでは、 [splice](https://vocajs.com/#splice) という名前でご要望のメソッドが提供されています。
74
74
 
75
75
  そして、この vocajs の splice のソースコードを見てみると、以下
76
76
 

7

テキスト修正

2019/10/31 19:42

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -70,7 +70,7 @@
70
70
 
71
71
  ### 追記3
72
72
 
73
- 文字列を操作するための [vocajs](https://vocajs.com/) というライブラリがあります。Githubのレポジトリに現時点で、約2700のStarがついているので、それなりに支持されているようですが、このライブラリから、 [splice](https://vocajs.com/#splice) という名前でご要望のメソッドが提供されています。
73
+ 文字列を操作するための [vocajs](https://vocajs.com/) というライブラリがあります。Githubのレポジトリに現時点で、約2700のStarがついているので、それなりに支持されているようですが、このライブラリでは、 [splice](https://vocajs.com/#splice) という名前でご要望のメソッドが提供されています。
74
74
 
75
75
  そして、この vocajs の splice のソースコードを見てみると、以下
76
76
 

6

テキスト修正

2019/10/31 19:36

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -72,7 +72,7 @@
72
72
 
73
73
  文字列を操作するための [vocajs](https://vocajs.com/) というライブラリがあります。Githubのレポジトリに現時点で、約2700のStarがついているので、それなりに支持されているようですが、このライブラリから、 [splice](https://vocajs.com/#splice) という名前でご要望のメソッドが提供されています。
74
74
 
75
- そして、この vocajs の splice のソースコードを見てると、以下
75
+ そして、この vocajs の splice のソースコードを見てると、以下
76
76
 
77
77
  - [https://github.com/panzerdp/voca/blob/master/src/manipulate/splice.js#L44](https://github.com/panzerdp/voca/blob/master/src/manipulate/splice.js#L44)
78
78
 

5

テキスト修正

2019/10/31 19:33

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -37,7 +37,7 @@
37
37
 
38
38
  以上、参考になれば幸いです。
39
39
 
40
- ### 追記
40
+ ### 追記1
41
41
 
42
42
  Y.NINOMIYAさんのご質問の本文中に
43
43
 
@@ -66,4 +66,14 @@
66
66
  ```
67
67
  と比較して、 置き換え後の文字列を`slice` で得られる前後の文字列で挟むように連結する(この回答の冒頭に挙げた) `spliceSlice` のほうがパフォーマンスが良かったことを、以下のようにパフォーマンスツールでの実測へのリンクを挙げて説明しています。
68
68
 
69
- > Here's a [jsperf](https://jsperf.com/split-or-slice-for-string-splice/2) that compares the two and a couple other methods.
69
+ > Here's a [jsperf](https://jsperf.com/split-or-slice-for-string-splice/2) that compares the two and a couple other methods.
70
+
71
+ ### 追記3
72
+
73
+ 文字列を操作するための [vocajs](https://vocajs.com/) というライブラリがあります。Githubのレポジトリに現時点で、約2700のStarがついているので、それなりに支持されているようですが、このライブラリから、 [splice](https://vocajs.com/#splice) という名前でご要望のメソッドが提供されています。
74
+
75
+ そして、この vocajs の splice のソースコードを見てると、以下
76
+
77
+ - [https://github.com/panzerdp/voca/blob/master/src/manipulate/splice.js#L44](https://github.com/panzerdp/voca/blob/master/src/manipulate/splice.js#L44)
78
+
79
+ のように、やっていることは、先の `spliceSlice` と基本的には同じでした。

4

テキスト修正

2019/10/31 19:32

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -64,6 +64,6 @@
64
64
  return ar.join('');
65
65
  }
66
66
  ```
67
- と比較して、 置き換え後の文字列を`slice` で得られる前後の文字列で挟むように連結する `spliceSlice` のほうがパフォーマンスが良かったことを、以下のようにパフォーマンスツールでの実測へのリンクを挙げて説明しています。
67
+ と比較して、 置き換え後の文字列を`slice` で得られる前後の文字列で挟むように連結する(この回答の冒頭に挙げた) `spliceSlice` のほうがパフォーマンスが良かったことを、以下のようにパフォーマンスツールでの実測へのリンクを挙げて説明しています。
68
68
 
69
69
  > Here's a [jsperf](https://jsperf.com/split-or-slice-for-string-splice/2) that compares the two and a couple other methods.

3

テキスト修正

2019/10/31 19:01

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -51,4 +51,19 @@
51
51
 
52
52
  > 最初は指定箇所以外を切り取って別で連結させる方法をとっっていたのですが非効率な気がし、
53
53
 
54
- **答え:** 先述のstackoverflow の[ベストアンサー](https://stackoverflow.com/a/21350614)のコードも、そのような、「切り取って別で連結させる」ものですので、Y.NINOMIYAさんがご自身で書いた、一見「非効率な気が」するコードでよいのではと思いますが、それでもご自身のコードに確信が持てない場合は、そちらのコードを開示して、「このコードに非効率なところはありませんか?」というご質問をされると、より求めていらっしゃる回答が得られるかもしれません。
54
+ **答え:** 先述のstackoverflow の[ベストアンサー](https://stackoverflow.com/a/21350614)のコードも、そのような、「切り取って別で連結させる」ものですので、Y.NINOMIYAさんがご自身で書いた、一見「非効率な気が」するコードでよいのではと思いますが、それでもご自身のコードに確信が持てない場合は、そちらのコードを開示して、「このコードに非効率なところはありませんか?」というご質問をされると、より求めていらっしゃる回答が得られるかもしれません。
55
+
56
+
57
+ ### 追記2
58
+
59
+ 参考までに、先に挙げたstackoverflowの[ベストアンサー](https://stackoverflow.com/a/21350614) では、配列の `splice` を経由する、以下の `spliceSplit`
60
+ ```javascript
61
+ function spliceSplit(str, index, count, add) {
62
+ var ar = str.split('');
63
+ ar.splice(index, count, add);
64
+ return ar.join('');
65
+ }
66
+ ```
67
+ と比較して、 置き換え後の文字列を`slice` で得られる前後の文字列で挟むように連結する `spliceSlice` のほうがパフォーマンスが良かったことを、以下のようにパフォーマンスツールでの実測へのリンクを挙げて説明しています。
68
+
69
+ > Here's a [jsperf](https://jsperf.com/split-or-slice-for-string-splice/2) that compares the two and a couple other methods.

2

テキスト修正

2019/10/31 18:54

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -31,8 +31,10 @@
31
31
  ```
32
32
  とするのも一案として検討してよいかもしれません。
33
33
 
34
- - **動作確認用 CodePen:** [https://codepen.io/jun68ykt/pen/qBBVrqv?editors=0011](https://codepen.io/jun68ykt/pen/qBBVrqv?editors=0011)
34
+ ただし、R.Mizukamiさんからコメントでご指摘がありましたように、 `splice` をそのままメソッド名に使うのはふさわしくないので、仮に `replaceSubsequence` としておき、以下、その使用例です。
35
35
 
36
+ - **動作確認用 CodePen:** [https://codepen.io/jun68ykt/pen/yLLPKwM?editors=0011](https://codepen.io/jun68ykt/pen/yLLPKwM?editors=0011)
37
+
36
38
  以上、参考になれば幸いです。
37
39
 
38
40
  ### 追記

1

テキスト修正

2019/10/31 18:09

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -33,4 +33,20 @@
33
33
 
34
34
  - **動作確認用 CodePen:** [https://codepen.io/jun68ykt/pen/qBBVrqv?editors=0011](https://codepen.io/jun68ykt/pen/qBBVrqv?editors=0011)
35
35
 
36
- 以上、参考になれば幸いです。
36
+ 以上、参考になれば幸いです。
37
+
38
+ ### 追記
39
+
40
+ Y.NINOMIYAさんのご質問の本文中に
41
+
42
+ > そもそものそのような関数はないのでしょうか。最初は指定箇所以外を切り取って別で連結させる方法をとっっていたのですが非効率な気がし、やり方を調べていて今に至った形です。
43
+
44
+ とありましたが、上記に対する直接の回答としては、以下の二点です。
45
+
46
+ > そのような関数はないのでしょうか。
47
+
48
+ **答え:** Stringの標準メソッドとして、そのものズバリのメソッドは用意されていないです。
49
+
50
+ > 最初は指定箇所以外を切り取って別で連結させる方法をとっっていたのですが非効率な気がし、
51
+
52
+ **答え:** 先述のstackoverflow の[ベストアンサー](https://stackoverflow.com/a/21350614)のコードも、そのような、「切り取って別で連結させる」ものですので、Y.NINOMIYAさんがご自身で書いた、一見「非効率な気が」するコードでよいのではと思いますが、それでもご自身のコードに確信が持てない場合は、そちらのコードを開示して、「このコードに非効率なところはありませんか?」というご質問をされると、より求めていらっしゃる回答が得られるかもしれません。