JavaScriptのsplitメソッドで詰まった話(教訓)
今回は短めですが、js を使っている中で、困った点があったので、書き留めておきます。
結論
Python でいう、
str_1, str_2, str_3 = "a,b,c,d,e,...".split(",", 2)
は、
×
const [str_1, str_2, str_3] = "a,b,c,d,e,...".split(",", 2);
○
const [str_1, str_2, ..._str_3] = "a,b,c,d,e,...".split(",");
const str_3 = _str_3.join(",");
とする!
以下でもう少し詳細に説明します。
詰まりポイント
csv を扱っていた際に、"a,b,c,d,e,..."
という文字列があり、"a", "b", "c,d,e,..."
のように分割したいと思っていました。
Python だと以下のように書けます。
>>> str_1, str_2, str_3 = "a,b,c,d,e,...".split(",")
>>> print(str_1)
a
>>> print(str_2)
b
>>> print(str_3)
c,d,e,...
split メソッドのドキュメントを見てみると、str.split(sep=None, maxsplit=-1)
となっており、maxsplit
で分割する回数を指定できます。
js でも書いてみよう!
Python での知識をもとに、同じノリで思考停止で書きました。
js にもString.prototype.split()
というメソッドが用意されています。
> const [str_1, str_2, str_3] = "a,b,c,d,e,...".split(",", 2);
> console.log(str_1);
'a'
> console.log(str_2);
'b'
> console.log(str_3);
undefined
おやおや???
limit
(Python でいうmaxsplit
)の数え方が違うのでしょうか。
> const [str_1, str_2, str_3] = "a,b,c,d,e,...".split(",", 3);
> console.log(str_3);
'c'
あれれ〜
この時点でドキュメントを見に行けば良かったのですが、血迷った末、他の箇所の原因などを探りながら 1 時間近くを無駄にしました。。。
じゃあどうすればいいの?
String.prototype.split()
のドキュメントには、このように書いていました。
非負の整数で、分割する数を制限します。指定された場合、文字列は separator が現れるたびに分割されますが、 limit の数の項目が配列に配置されると停止します。残りのテキストは配列に入りません。
めちゃくちゃちゃんと書いてある。。。「残りのテキストは配列に入りません。」 とのことでした。
一旦全て分割してから、再度繋げるというのが良さそうです。
const [str_1, str_2, ..._str_3] = "a,b,c,d,e,...".split(","); // _str_3 = ['c', 'd', 'e', '...']
const str_3 = _str_3.join(",");
...
をつけることによって、残りの要素を配列として取れるようにしています。(...
を忘れると、c
しか撮れないので注意)
これで思い通りに文字をとってくることができました!
> console.log(str_3);
'c,d,e,...'
まとめ
ドキュメントはちゃんと読みましょう。
他言語の知識で脳死で書いていると痛い目を見ます。
Discussion