回答編集履歴
4
冗長だった
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
|
-
|
65
|
+
yield obj = obj[attr];
|
70
|
-
|
71
|
-
};
|
72
66
|
|
73
67
|
}
|
74
68
|
|
3
別解2
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
軽微な修正
test
CHANGED
@@ -42,6 +42,6 @@
|
|
42
42
|
|
43
43
|
const lang = 'jp';
|
44
44
|
|
45
|
-
const name = opt(obj)('parent')(item)(lang)()
|
45
|
+
const name = opt(obj)('parent')(item)(lang)() || 'notext';
|
46
46
|
|
47
47
|
```
|
1
別解
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
|
+
```
|