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

回答編集履歴

2

注意文を追加

2020/03/03 06:16

投稿

miyabi-sun
miyabi-sun

スコア21461

answer CHANGED
@@ -23,15 +23,18 @@
23
23
 
24
24
  ---
25
25
 
26
- コードのテクニックで解決するならば、
27
- [Ramda.jsのpath](https://ramdajs.com/docs/#path)や、
26
+ 毎回`(((obj.parent || {}).apple || {}).jp || null)`とか書くと読みづらくて仕方ないですね。
28
- [Lodashのget](https://lodash.com/docs/4.17.15#get)といった解決策があります。
29
27
 
28
+ ES5でも何とか出来ます。
29
+ [Ramda.jsのpath](https://ramdajs.com/docs/#path)や、[Lodashのget](https://lodash.com/docs/4.17.15#get)といった解決策があります。
30
+
30
31
  オブジェクトのキーは別にキー名の一部として`.`を所持することは禁止されていないはずですが、
31
32
  JSでプロパティをチェーンする場合は`A.B.C`と書きたいのでくっそ邪魔ですね。
32
33
  なので文字列の`.`にしたり、配列を利用して再帰で取りに行く関数を実装すると良いでしょう。
33
34
 
34
35
  コードにするとこんな感じ
36
+ ただまぁ、LodashやRamda.jsといったライブラリの方がきちんとテストされているので、
37
+ 実際に導入するならライブラリを利用することをオススメします。
35
38
 
36
39
  ```js
37
40
  var obj = {

1

ちょっとだけ修正

2020/03/03 06:16

投稿

miyabi-sun
miyabi-sun

スコア21461

answer CHANGED
@@ -29,7 +29,7 @@
29
29
 
30
30
  オブジェクトのキーは別にキー名の一部として`.`を所持することは禁止されていないはずですが、
31
31
  JSでプロパティをチェーンする場合は`A.B.C`と書きたいのでくっそ邪魔ですね。
32
- なので文字列の`.`にしたり、配列を利用して再で取りに行く関数を実装すると良いでしょう。
32
+ なので文字列の`.`にしたり、配列を利用して再で取りに行く関数を実装すると良いでしょう。
33
33
 
34
34
  コードにするとこんな感じ
35
35
 
@@ -46,11 +46,11 @@
46
46
 
47
47
  const get = (obj, key) => {
48
48
  if (key == '') return obj; // 正常終了
49
- if (typeof obj !== 'object') return null; // 存在しないキー
49
+ if (obj == null) return obj; // 存在しないキー
50
50
  const keys = key.split('.');
51
51
  return get(obj[keys[0]], keys.slice(1).join('.'));
52
52
  }
53
53
 
54
54
  console.log(get(obj, 'parent.apple.jp')); // "りんご"
55
- console.log(get(obj, 'parent.banana.jp')); // null
55
+ console.log(get(obj, 'parent.banana.jp')); // undefined
56
56
  ```