回答編集履歴

4

冗長だった

2020/03/03 10:31

投稿

Lhankor_Mhy
Lhankor_Mhy

スコア36134

test CHANGED
@@ -60,15 +60,9 @@
60
60
 
61
61
  for (attr of attrs){
62
62
 
63
- if ( obj == null ) {
63
+ if ( obj == null ) return undefined;
64
64
 
65
- return undefined;
66
-
67
- } else {
68
-
69
- yield obj = obj[attr];
65
+ yield obj = obj[attr];
70
-
71
- };
72
66
 
73
67
  }
74
68
 

3

別解2

2020/03/03 10:31

投稿

Lhankor_Mhy
Lhankor_Mhy

スコア36134

test CHANGED
@@ -30,7 +30,7 @@
30
30
 
31
31
  ### 別解
32
32
 
33
-
33
+ 再帰とカリー化でユーティリティ関数を書いてみました。
34
34
 
35
35
  ```js
36
36
 
@@ -45,3 +45,47 @@
45
45
  const name = opt(obj)('parent')(item)(lang)() || 'notext';
46
46
 
47
47
  ```
48
+
49
+
50
+
51
+
52
+
53
+ ### 別解2
54
+
55
+ 今度はジェネレータと早期リターンで書いてみました。イテレータの最後の要素にアクセスする上手い方法はないものか。
56
+
57
+ ```js
58
+
59
+ const opt = (obj, attrs) => [...(function* (){
60
+
61
+ for (attr of attrs){
62
+
63
+ if ( obj == null ) {
64
+
65
+ return undefined;
66
+
67
+ } else {
68
+
69
+ yield obj = obj[attr];
70
+
71
+ };
72
+
73
+ }
74
+
75
+ })()].slice(-1)[0];
76
+
77
+
78
+
79
+ const item = 'apple';
80
+
81
+ const lang = 'jp';
82
+
83
+ const name = opt(obj, ['parent', item, lang]) || 'notext';
84
+
85
+ ```
86
+
87
+
88
+
89
+ かっこかっこがなくなってウザさが減ったと思います。
90
+
91
+ あと、早期リターンをしているので、浅い階層でプロパティがなかった場合に省コスト、かも?

2

軽微な修正

2020/03/03 10:23

投稿

Lhankor_Mhy
Lhankor_Mhy

スコア36134

test CHANGED
@@ -42,6 +42,6 @@
42
42
 
43
43
  const lang = 'jp';
44
44
 
45
- const name = opt(obj)('parent')(item)(lang)()// || 'notext';
45
+ const name = opt(obj)('parent')(item)(lang)() || 'notext';
46
46
 
47
47
  ```

1

別解

2020/03/03 04:44

投稿

Lhankor_Mhy
Lhankor_Mhy

スコア36134

test CHANGED
@@ -25,3 +25,23 @@
25
25
  ブラウザ対応状況
26
26
 
27
27
  [Can I use... Support tables for HTML5, CSS3, etc](https://caniuse.com/#feat=mdn-javascript_operators_optional_chaining)
28
+
29
+
30
+
31
+ ### 別解
32
+
33
+
34
+
35
+ ```js
36
+
37
+ const opt = x => attr => attr == null ? x : opt( x == null ? undefined : x[attr] );
38
+
39
+
40
+
41
+ const item = 'xxx';
42
+
43
+ const lang = 'jp';
44
+
45
+ const name = opt(obj)('parent')(item)(lang)()// || 'notext';
46
+
47
+ ```