回答編集履歴

1

再帰処理

2019/10/04 03:24

投稿

think49
think49

スコア18162

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