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

回答編集履歴

1

再帰処理

2019/10/04 03:24

投稿

think49
think49

スコア18194

answer CHANGED
@@ -1,7 +1,54 @@
1
+ ### 要件不明瞭
2
+
3
+ > 以下の形式になるように、文字列からオブジェクトに変換するスマートな方法は何かないものでしょうか?
4
+
5
+ 漠然と「スマート」と書かれても回答者には伝わりませんので、要件は「具体的」に書いて下さい。
6
+
1
7
  > JSON.parse(JSON.stringify())みたいな1行でできる方法はないかを探しています。。。
2
8
 
3
- コードを短くする事よりも、文法を厳密にして、厳しくチェックする方が重要だと思い
9
+ 1行で書きした
4
10
 
5
11
  - [parseProperty \- JSFiddle](https://jsfiddle.net/6pyj3qdu/)
6
12
 
13
+ ### 厳密性
14
+
15
+ コードを短くする事よりも、文法を厳密にして、厳しくチェックする方が重要だと思います。
16
+
17
+ > 厳しくチェックする方が重要だと押し付けられても、、、。
18
+
19
+ 厳密性を問うのは、要件が厳密でないコードは、予期せぬ不具合を仕込むからです。
20
+
21
+ ```JavaScript
22
+ /**
23
+ * エラーを返すべき文字列
24
+ */
25
+ 'abc';
26
+ 'abc[0][';
27
+ 'abc[0]xyz[a]';
28
+ 'abc[';
29
+ 'abc[]';
30
+
31
+ /**
32
+ * 正しくパースされるべき文字列
33
+ */
34
+ 'abc[x[yz]'; // {'x[yz':null}
35
+ ```
36
+
37
+ 先に私が提案したコードは、この仕様に準じています。
38
+
39
+ 例えば、ベストアンサーに選ばれたjun68yktさんのコードは、独特の動きをします。
40
+
41
+ ```JavaScript
42
+ setValueByPath(obj, 'aaa[0]bbb[header]ccc[bbb]' , 'hello world');
43
+ ```
44
+
45
+ ### 再帰処理
46
+
47
+ ご指定の文法は、複数のトークンに分けて、複数回マッチさせる必要があるので、再帰処理が必要になります。
48
+
49
+ A. `String.prototype.replace` にgフラグ付正規表現、コールバック関数を指定
50
+ B. `RegExp.prototype.exec` にgフラグ付正規表現を指定し、`while` ループ
51
+
52
+ 今回、必要な返り値は文字列ではないので、B. を採用しました。
53
+
7
54
  Re: POSTMAN さん