回答編集履歴

1

テキスト修正

2019/08/04 01:07

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -37,3 +37,137 @@
37
37
 
38
38
 
39
39
  参考になれば幸いです。
40
+
41
+
42
+
43
+ ### 追記
44
+
45
+
46
+
47
+ 以下は、「こんな風にも書けます」というリファクタ案です。
48
+
49
+
50
+
51
+ `appendUserMemberList` に渡す、`user_name` と `user_id` を取ってくるところが、以下
52
+
53
+
54
+
55
+ **修正前:**
56
+
57
+ ```javascript
58
+
59
+ var user_name = $(this).attr('data-user-name');
60
+
61
+ var user_id = $(this).attr('data-user-id');
62
+
63
+ ```
64
+
65
+ のようになっていますが、この後、`data-user-*` の属性が増えて、 たとえば`data-user-age` が追加されたときに、一行追加して
66
+
67
+ ```
68
+
69
+ var user_name = $(this).attr('data-user-name');
70
+
71
+ var user_id = $(this).attr('data-user-id');
72
+
73
+ var user_age = $(this).attr('data-user-age');
74
+
75
+ ```
76
+
77
+ とすると、似たような行が増えてしまいます。また、 `data-user-age` 属性の値には `"20"` のような数字が入っているとすると、取り出したときに、文字列(String)ではなく、数(Number)で取れたほうが望ましい場合があります。
78
+
79
+
80
+
81
+ 以上を考慮すると、上記の3行を以下のように書くことができます。
82
+
83
+
84
+
85
+ **修正後:**
86
+
87
+ ```javascript
88
+
89
+ var user = ['name', 'id', 'age'].reduce( (obj, key) => (
90
+
91
+ { ...obj, [key]: $(this).data(`user-${key}`) }
92
+
93
+ ), {})
94
+
95
+ ```
96
+
97
+
98
+
99
+ 上記のようにすると `user` には、以下のようなオブジェクトが入ってきます。
100
+
101
+ ```javascript
102
+
103
+ {
104
+
105
+ name: '田中',
106
+
107
+ id: 'USER-A001',
108
+
109
+ age: 20
110
+
111
+ }
112
+
113
+ ```
114
+
115
+ 上記のように、 `age` プロパティには、文字列の `"20"` ではなく、数値の `20` が入ってきます。
116
+
117
+ 仮にこの後、さらに、`data-user-occupation` が増えても、以下で対応できます。
118
+
119
+ ```javascript
120
+
121
+ var user = ['name', 'id', 'age', 'occupation'].reduce( (obj, key) => (
122
+
123
+ { ...obj, [key]: $(this).data(`user-${key}`) }
124
+
125
+ ), {})
126
+
127
+ ```
128
+
129
+
130
+
131
+
132
+
133
+ 次に `appendUserMemberList` の引数の受け取り方を、[分割代入](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment) を使って以下のようにします。
134
+
135
+
136
+
137
+ **修正後:**
138
+
139
+ ```
140
+
141
+ function appendUserMemberList({ name, id }) {
142
+
143
+ ```
144
+
145
+
146
+
147
+ こうしておいて、関数本体では `name` と `id` を使って以下のようにします。
148
+
149
+
150
+
151
+ **修正後:**
152
+
153
+ ```
154
+
155
+ var html = `<div class='chat-group-user clearfix js-chat-member' id='${id}'>
156
+
157
+ <input name='group[user_ids][]' type='hidden' value='${id}'>
158
+
159
+ <p class='chat-group-user__name'>${name}</p>
160
+
161
+ ```
162
+
163
+
164
+
165
+ 上記のようにしておいて、この関数を使うときは、先の `user` オブジェクトをそのまま渡します。
166
+
167
+
168
+
169
+ ```
170
+
171
+ appendUserMemberList(user);
172
+
173
+ ```