回答編集履歴

16

テキスト修正

2019/11/02 10:15

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -345,3 +345,11 @@
345
345
 
346
346
 
347
347
  とのことだったので、毎回、前方部分と後方部分を切り出して、置換後の文字列と連結するコードを書くのは煩わしい、ということはあると思うので、先に挙げた 、stackoverflow のベストアンサーに挙げられていた [spliceSlice()](https://stackoverflow.com/a/21350614) のような関数を自作して使い回すか、あるいは自作も不要な策として、追記3で挙げた、vocajsの[splice](https://vocajs.com/#splice) を使ってみることを検討してみてもよいかもしれません。
348
+
349
+
350
+
351
+ 以下は、vocajsの[splice](https://vocajs.com/#splice) を使って `"Hello,World!"` の "World" を "Japan" に置き換える例です。
352
+
353
+
354
+
355
+ - 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

test CHANGED
@@ -283,3 +283,65 @@
283
283
  ```
284
284
 
285
285
  をお勧めしたいと思います。
286
+
287
+
288
+
289
+ ### 追記5
290
+
291
+
292
+
293
+ 質問への追記・修正、ベストアンサー選択の依頼へのコメントに、Y.NINOMIYAさんからのコメントで
294
+
295
+
296
+
297
+ > Y.NINOMIYA 2019/11/01 22:18
298
+
299
+ 置き換えたい文字列が全体に複数ある場合に対応するため、また、全体の文字列もある程度規則性があり、置換の開始位置はそうそう変わらないので「文字列の◯番目から△番目を置換する」という方法を取りたかったのです。
300
+
301
+
302
+
303
+ とありましたので、これをふまえて元のご質問にある
304
+
305
+
306
+
307
+ > そもそものそのような関数はないのでしょうか。最初は指定箇所以外を切り取って別で連結させる方法をとっっていたのですが非効率な気がし、やり方を調べていて今に至った形です。
308
+
309
+
310
+
311
+ に返答します。
312
+
313
+
314
+
315
+ > 非効率な気がし
316
+
317
+
318
+
319
+ とのことですが、「文字列の◯番目から△番目を置換する」方法として、Y.NINOMIYA さんがお書きになった
320
+
321
+
322
+
323
+ ```javascript
324
+
325
+ var str = "Hello,World!";
326
+
327
+ var str_1 = str.substr(0, 6) //"Hello"を切り出し
328
+
329
+ var str_2 = str.substr(11, 1); //"!"を切り出し
330
+
331
+ str = str_1 + "Japan" + str_2;
332
+
333
+ ```
334
+
335
+ というコードが、アルゴリズムとして、特段、効率が悪いことをやっている、ということはないと思います。
336
+
337
+
338
+
339
+ ただ、
340
+
341
+
342
+
343
+ > 置き換えたい文字列が全体に複数ある場合に対応するため、また、全体の文字列もある程度規則性があり、置換の開始位置はそうそう変わらないので
344
+
345
+
346
+
347
+ とのことだったので、毎回、前方部分と後方部分を切り出して、置換後の文字列と連結するコードを書くのは煩わしい、ということはあると思うので、先に挙げた 、stackoverflow のベストアンサーに挙げられていた [spliceSlice()](https://stackoverflow.com/a/21350614) のような関数を自作して使い回すか、あるいは自作も不要な策として、追記3で挙げた、vocajsの[splice](https://vocajs.com/#splice) を使ってみることを検討してみてもよいかもしれません。

14

テキスト修正

2019/11/02 03:40

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -256,7 +256,7 @@
256
256
 
257
257
 
258
258
 
259
- とはいえ、Y.NINOMIYAさんとしては
259
+ Y.NINOMIYAさんとしては
260
260
 
261
261
 
262
262
 
@@ -264,7 +264,7 @@
264
264
 
265
265
 
266
266
 
267
- するというやり方にこだわりがおありで、文字列に対して、 Array の[splice](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/splice) のような操作をする効率的なやり方をお求めなのか、または、 `"World"` を `"Japan"` に置き換えることが主目的なので、
267
+ するというやり方にこだわりがおありで、文字列に対して、 Array の[splice](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/splice) のような操作をするときの効率的なやり方をお求めなのか、または、 `"World"` を `"Japan"` に置き換えることが主目的なので、
268
268
 
269
269
 
270
270
 

13

テキスト修正

2019/11/01 07:19

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -167,3 +167,119 @@
167
167
 
168
168
 
169
169
  のように、やっていることは、先の `spliceSlice` と基本的には同じでした。
170
+
171
+
172
+
173
+
174
+
175
+ ### 追記4
176
+
177
+
178
+
179
+ 質問への追記・修正、ベストアンサー選択の依頼へのY.NINOMIYAさんの以下のコメント
180
+
181
+
182
+
183
+ > Y.NINOMIYA 2019/11/01 13:03
184
+
185
+ var str = "Hello,World!";
186
+
187
+ console.log(str);
188
+
189
+ var str_1 = str.substr(0, 6) //"Hello"を切り出し
190
+
191
+ var str_2 = str.substr(11, 1); //"!"を切り出し
192
+
193
+ str = str_1 + "Japan" + str_2;
194
+
195
+ console.log(str); //“Hello,Japan!”と出力
196
+
197
+ このような形でやっていました
198
+
199
+
200
+
201
+ を拝読したので、追記します。
202
+
203
+
204
+
205
+ - 文字列 `var str = "Hello,World!"` に含まれる部分文字列 `"World"` を `"Japan"` に置き換えて、 `"Hello,Japan!"` という文字列を得たい。
206
+
207
+
208
+
209
+ ということが課題であるとすると、この課題を解決するための手段として、ご質問にある
210
+
211
+
212
+
213
+ > 文字列の◯番目から△番目を他の文字列に置換
214
+
215
+
216
+
217
+ するという方法を選ぶこと自体が非効率かもしれません。(この場合の「非効率」とは「わざわざ面倒なやり方をしている」ぐらいの意味です。)
218
+
219
+
220
+
221
+ なぜなら
222
+
223
+
224
+
225
+ ```javascript
226
+
227
+ var str_1 = str.substr(0, 6);
228
+
229
+ var str_2 = str.substr(11, 1);
230
+
231
+ ```
232
+
233
+
234
+
235
+ というコードを書こうとすると、`6` や `11` という数を得るために `World` の直前と直後のインデクスを目視で数えなければならないからです。そのようなことをしなくても、 `var str = "Hello,World!"` に含まれる`"World"` を `"Japan"` に置き換えるには、 [replace](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/replace)を使って、以下で済みます。
236
+
237
+
238
+
239
+ ```javascript
240
+
241
+ var str = "Hello,World!";
242
+
243
+
244
+
245
+ str = str.replace('World', 'Japan');
246
+
247
+
248
+
249
+ console.log(str);
250
+
251
+ ```
252
+
253
+ - **動作確認用CodePen: ** [https://codepen.io/jun68ykt/pen/NWWwJYW?editors=0012](https://codepen.io/jun68ykt/pen/NWWwJYW?editors=0012)
254
+
255
+
256
+
257
+
258
+
259
+ とはいえ、Y.NINOMIYAさんとしては
260
+
261
+
262
+
263
+ > 文字列の◯番目から△番目を他の文字列に置換
264
+
265
+
266
+
267
+ するというやり方にこだわりがおありで、文字列に対して、 Array の[splice](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/splice) のような操作をする効率的なやり方をお求めなのか、または、 `"World"` を `"Japan"` に置き換えることが主目的なので、
268
+
269
+
270
+
271
+ > 文字列の◯番目から△番目を他の文字列に置換
272
+
273
+
274
+
275
+ するという方針も見直せる余地がおありなのかは、回答者には分からないところはありますが、`"World"` を `"Japan"` に置き換えたい、ということであれば、 `6` や `11` を使わなくて済む
276
+
277
+
278
+
279
+ ```
280
+
281
+ str.replace('World', 'Japan')
282
+
283
+ ```
284
+
285
+ をお勧めしたいと思います。

12

テキスト修正

2019/11/01 07:11

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -142,7 +142,7 @@
142
142
 
143
143
 
144
144
 
145
- 文字列を操作するための [vocajs](https://vocajs.com/) というライブラリがあります。[Githubのレポジトリ](https://github.com/panzerdp/voca)に現時点で、約2700のStarがついているので、それなりに支持されているようですが、このライブラリでは、 `splice` という名前でご要望のメソッドが、以下のように提供されています。
145
+ 文字列を操作するための [vocajs](https://vocajs.com/) というライブラリがあります。[Githubのレポジトリ](https://github.com/panzerdp/voca)に現時点で、約2700のStarがついているので、それなりに支持されているようですが、このライブラリでは、(先ほど "若干憚られる" と書いた) `splice` という名前でご要望のメソッドが、以下のように提供されています。
146
146
 
147
147
 
148
148
 

11

テキスト修正

2019/11/01 01:40

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
 
8
8
 
9
- - stackoverflow: [Is there a splice method for strings?](https://stackoverflow.com/questions/20817618/is-there-a-splice-method-for-strings)
9
+ - **stackoverflow:** [Is there a splice method for strings?](https://stackoverflow.com/questions/20817618/is-there-a-splice-method-for-strings)
10
10
 
11
11
 
12
12
 

10

テキスト修正

2019/11/01 00:49

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -142,11 +142,23 @@
142
142
 
143
143
 
144
144
 
145
- 文字列を操作するための [vocajs](https://vocajs.com/) というライブラリがあります。[Githubのレポジトリ](https://github.com/panzerdp/voca)に現時点で、約2700のStarがついているので、それなりに支持されているようですが、このライブラリでは、 [splice](https://vocajs.com/#splice) という名前でご要望のメソッドが提供されています。
145
+ 文字列を操作するための [vocajs](https://vocajs.com/) というライブラリがあります。[Githubのレポジトリ](https://github.com/panzerdp/voca)に現時点で、約2700のStarがついているので、それなりに支持されているようですが、このライブラリでは、 `splice` という名前でご要望のメソッドが、以下のように提供されています。
146
146
 
147
147
 
148
148
 
149
+ > **v.splice**(subjectopt='', start, deleteCountopt=subject.length-start, toAddopt='') → {string}
150
+
151
+ >
152
+
153
+ > Changes subject by deleting deleteCount of characters starting at position start. Places a new string toAdd instead of deleted characters.
154
+
155
+
156
+
157
+ - Voca: The JavaScript string library [vocajs.com/#splice](https://vocajs.com/#splice)
158
+
159
+
160
+
149
- そして、この vocajs の splice のソースコードを見てみると、以下
161
+ この Voca の spliceメソッドのソースコードを見てみると、以下
150
162
 
151
163
 
152
164
 

9

テキスト修正

2019/11/01 00:46

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -64,7 +64,7 @@
64
64
 
65
65
 
66
66
 
67
- ただし、R.Mizukamiさんからコメントでご指摘がありましたように、 `splice` をそのままメソッド名に使うのはふさわしくないので、仮に `replaceSubsequence` としておき、以下、その使用例です。
67
+ ただし、R.Mizukamiさんからコメントでご指摘がありましたように、 `splice` をそのままメソッド名に使うのは若干憚られるため、仮に `replaceSubsequence` としておき、以下、その使用例です。
68
68
 
69
69
 
70
70
 

8

テキスト修正

2019/10/31 19:57

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -142,7 +142,7 @@
142
142
 
143
143
 
144
144
 
145
- 文字列を操作するための [vocajs](https://vocajs.com/) というライブラリがあります。Githubのレポジトリに現時点で、約2700のStarがついているので、それなりに支持されているようですが、このライブラリでは、 [splice](https://vocajs.com/#splice) という名前でご要望のメソッドが提供されています。
145
+ 文字列を操作するための [vocajs](https://vocajs.com/) というライブラリがあります。[Githubのレポジトリ](https://github.com/panzerdp/voca)に現時点で、約2700のStarがついているので、それなりに支持されているようですが、このライブラリでは、 [splice](https://vocajs.com/#splice) という名前でご要望のメソッドが提供されています。
146
146
 
147
147
 
148
148
 

7

テキスト修正

2019/10/31 19:42

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -142,7 +142,7 @@
142
142
 
143
143
 
144
144
 
145
- 文字列を操作するための [vocajs](https://vocajs.com/) というライブラリがあります。Githubのレポジトリに現時点で、約2700のStarがついているので、それなりに支持されているようですが、このライブラリから、 [splice](https://vocajs.com/#splice) という名前でご要望のメソッドが提供されています。
145
+ 文字列を操作するための [vocajs](https://vocajs.com/) というライブラリがあります。Githubのレポジトリに現時点で、約2700のStarがついているので、それなりに支持されているようですが、このライブラリでは、 [splice](https://vocajs.com/#splice) という名前でご要望のメソッドが提供されています。
146
146
 
147
147
 
148
148
 

6

テキスト修正

2019/10/31 19:36

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -146,7 +146,7 @@
146
146
 
147
147
 
148
148
 
149
- そして、この vocajs の splice のソースコードを見てると、以下
149
+ そして、この vocajs の splice のソースコードを見てると、以下
150
150
 
151
151
 
152
152
 

5

テキスト修正

2019/10/31 19:33

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -76,7 +76,7 @@
76
76
 
77
77
 
78
78
 
79
- ### 追記
79
+ ### 追記1
80
80
 
81
81
 
82
82
 
@@ -135,3 +135,23 @@
135
135
 
136
136
 
137
137
  > Here's a [jsperf](https://jsperf.com/split-or-slice-for-string-splice/2) that compares the two and a couple other methods.
138
+
139
+
140
+
141
+ ### 追記3
142
+
143
+
144
+
145
+ 文字列を操作するための [vocajs](https://vocajs.com/) というライブラリがあります。Githubのレポジトリに現時点で、約2700のStarがついているので、それなりに支持されているようですが、このライブラリから、 [splice](https://vocajs.com/#splice) という名前でご要望のメソッドが提供されています。
146
+
147
+
148
+
149
+ そして、この vocajs の splice のソースコードを見てると、以下
150
+
151
+
152
+
153
+ - [https://github.com/panzerdp/voca/blob/master/src/manipulate/splice.js#L44](https://github.com/panzerdp/voca/blob/master/src/manipulate/splice.js#L44)
154
+
155
+
156
+
157
+ のように、やっていることは、先の `spliceSlice` と基本的には同じでした。

4

テキスト修正

2019/10/31 19:32

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -130,7 +130,7 @@
130
130
 
131
131
  ```
132
132
 
133
- と比較して、 置き換え後の文字列を`slice` で得られる前後の文字列で挟むように連結する `spliceSlice` のほうがパフォーマンスが良かったことを、以下のようにパフォーマンスツールでの実測へのリンクを挙げて説明しています。
133
+ と比較して、 置き換え後の文字列を`slice` で得られる前後の文字列で挟むように連結する(この回答の冒頭に挙げた) `spliceSlice` のほうがパフォーマンスが良かったことを、以下のようにパフォーマンスツールでの実測へのリンクを挙げて説明しています。
134
134
 
135
135
 
136
136
 

3

テキスト修正

2019/10/31 19:01

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -105,3 +105,33 @@
105
105
 
106
106
 
107
107
  **答え:** 先述のstackoverflow の[ベストアンサー](https://stackoverflow.com/a/21350614)のコードも、そのような、「切り取って別で連結させる」ものですので、Y.NINOMIYAさんがご自身で書いた、一見「非効率な気が」するコードでよいのではと思いますが、それでもご自身のコードに確信が持てない場合は、そちらのコードを開示して、「このコードに非効率なところはありませんか?」というご質問をされると、より求めていらっしゃる回答が得られるかもしれません。
108
+
109
+
110
+
111
+
112
+
113
+ ### 追記2
114
+
115
+
116
+
117
+ 参考までに、先に挙げたstackoverflowの[ベストアンサー](https://stackoverflow.com/a/21350614) では、配列の `splice` を経由する、以下の `spliceSplit`
118
+
119
+ ```javascript
120
+
121
+ function spliceSplit(str, index, count, add) {
122
+
123
+ var ar = str.split('');
124
+
125
+ ar.splice(index, count, add);
126
+
127
+ return ar.join('');
128
+
129
+ }
130
+
131
+ ```
132
+
133
+ と比較して、 置き換え後の文字列を`slice` で得られる前後の文字列で挟むように連結する `spliceSlice` のほうがパフォーマンスが良かったことを、以下のようにパフォーマンスツールでの実測へのリンクを挙げて説明しています。
134
+
135
+
136
+
137
+ > 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

test CHANGED
@@ -64,7 +64,11 @@
64
64
 
65
65
 
66
66
 
67
+ ただし、R.Mizukamiさんからコメントでご指摘がありましたように、 `splice` をそのままメソッド名に使うのはふさわしくないので、仮に `replaceSubsequence` としておき、以下、その使用例です。
68
+
69
+
70
+
67
- - **動作確認用 CodePen:** [https://codepen.io/jun68ykt/pen/qBBVrqv?editors=0011](https://codepen.io/jun68ykt/pen/qBBVrqv?editors=0011)
71
+ - **動作確認用 CodePen:** [https://codepen.io/jun68ykt/pen/yLLPKwM?editors=0011](https://codepen.io/jun68ykt/pen/yLLPKwM?editors=0011)
68
72
 
69
73
 
70
74
 

1

テキスト修正

2019/10/31 18:09

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -69,3 +69,35 @@
69
69
 
70
70
 
71
71
  以上、参考になれば幸いです。
72
+
73
+
74
+
75
+ ### 追記
76
+
77
+
78
+
79
+ Y.NINOMIYAさんのご質問の本文中に
80
+
81
+
82
+
83
+ > そもそものそのような関数はないのでしょうか。最初は指定箇所以外を切り取って別で連結させる方法をとっっていたのですが非効率な気がし、やり方を調べていて今に至った形です。
84
+
85
+
86
+
87
+ とありましたが、上記に対する直接の回答としては、以下の二点です。
88
+
89
+
90
+
91
+ > そのような関数はないのでしょうか。
92
+
93
+
94
+
95
+ **答え:** Stringの標準メソッドとして、そのものズバリのメソッドは用意されていないです。
96
+
97
+
98
+
99
+ > 最初は指定箇所以外を切り取って別で連結させる方法をとっっていたのですが非効率な気がし、
100
+
101
+
102
+
103
+ **答え:** 先述のstackoverflow の[ベストアンサー](https://stackoverflow.com/a/21350614)のコードも、そのような、「切り取って別で連結させる」ものですので、Y.NINOMIYAさんがご自身で書いた、一見「非効率な気が」するコードでよいのではと思いますが、それでもご自身のコードに確信が持てない場合は、そちらのコードを開示して、「このコードに非効率なところはありませんか?」というご質問をされると、より求めていらっしゃる回答が得られるかもしれません。