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

回答編集履歴

1

おまけ追加

2020/02/07 04:54

投稿

miyabi-sun
miyabi-sun

スコア21465

answer CHANGED
@@ -64,4 +64,52 @@
64
64
  console.log(rooms);
65
65
  // ["room1", "room2", "room3", "room4"]
66
66
  // 重複してないしroom3もroom4も含んでいる配列になった
67
+ ```
68
+
69
+ ---
70
+
71
+ 【おまけ】 データ構造変更の提案
72
+
73
+ > ```js
74
+ > [
75
+ > {"keyno":"A1","room1":"102","room2":"103"},
76
+ > {"keyno":"B2","room1":"201","room2":"202"},
77
+ > ];
78
+ > ```
79
+
80
+ 冒頭に存在するコレ、非常に扱いにくいです。
81
+ room1とかroom2とか誰が決めたんですか?
82
+ 1番目ルームなのに102号室だったり、201号室だったりして一貫性がありません。
83
+
84
+ 普通に考えてこうなっているべきです。
85
+ A1の鍵で開けられるのは102号室・103号室の2つですよという意味がバシッと通って使いやすくなっています。
86
+
87
+ ```js
88
+ [
89
+ {keyno:"A1", rooms: ["102", "103"]},
90
+ {keyno:"B2", rooms: ["201", "202"]},
91
+ ]
92
+ .filter(key => key.rooms.includes("102"))
93
+ .forEach(it => console.log(it));
94
+ // {keyno: "A1", rooms: ["102", "103"]}
95
+ ```
96
+
97
+ どうしても変更出来ないというのであれば、
98
+ こういう風にメインロジックに持ち込みやすい形に整形すると良いでしょう。
99
+
100
+ ```js
101
+ const keys = [
102
+ {"keyno":"A1","room1":"102","room2":"103"},
103
+ {"keyno":"B2","room1":"201","room2":"202"},
104
+ ].map(key => ({
105
+ keyno: key.keyno,
106
+ rooms: Object.keys(key).filter(it => it !== "keyno").map(it => key[it]),
107
+ }));
108
+ console.log(keys);
109
+ // [{keyno: "A1", rooms: ["102", "103"]}, {keyno: "B2", rooms: ["201", "202"]}]
110
+
111
+ keys
112
+ .filter(key => key.rooms.includes("102"))
113
+ .forEach(it => console.log(it));
114
+ // {keyno: "A1", rooms: Array(2)}
67
115
  ```