回答編集履歴

1

コメントを色々と追加しつつ、コードをリファクタリングしました

2016/08/24 14:43

投稿

MakeNowJust
MakeNowJust

スコア545

test CHANGED
@@ -60,93 +60,147 @@
60
60
 
61
61
  $(function () {
62
62
 
63
+ // jQueryでHTMLの要素を取得
64
+
65
+ var test = $('#test');
66
+
67
+ var log = $('#log');
68
+
69
+
70
+
71
+ // `#test`に表示されている値の基準値(最初は100)
72
+
63
- var base = 100;
73
+ var base = parseInt(test.val(), 10);
74
+
64
-
75
+ // 現在残っている中で一番最初に追加された値(元々の値から減っている可能性がある)
76
+
77
+ // 0の場合は、残っている値が無い状態
78
+
65
- var values = [];
79
+ var topValue = 0;
80
+
81
+ // 追加された元々の値達を格納する配列
66
82
 
67
83
  var originalValues = [];
68
84
 
69
- var test = $('#test');
85
+
70
-
86
+
71
- var log = $('#log');
87
+ // `#test`と`#log`の表示を更新する関数
72
-
73
-
74
-
88
+
75
- function sum(values) {
89
+ function update() {
90
+
76
-
91
+ // `#log`の中身を一旦削除
92
+
93
+ log.empty()
94
+
95
+ // 残っている値の合計を計算する変数
96
+
77
- var sum = 0;
97
+ var sum = topValue;
98
+
78
-
99
+ // 残っている値が存在するなら、`#log`にそれらの情報を追加する
100
+
101
+ if (topValue !== 0) {
102
+
103
+ log.append($('<li>').text('追加された値: ' + originalValues[0] + ' (残っている値: ' + topValue + ')'));
104
+
79
- for (var i = 0; i < values.length; i++) {
105
+ for (var i = 1; i < originalValues.length; i++) {
106
+
80
-
107
+ log.append($('<li>').text('追加された値: ' + originalValues[i]));
108
+
109
+ // `#log`に追加しつつ残っている値の合計の計算も進める
110
+
81
- sum += values[i];
111
+ sum += originalValues[i];
82
-
112
+
83
- }
113
+ }
114
+
84
-
115
+ }
116
+
117
+ // 残っている値の合計を基準値と足し合わせて表示
118
+
85
- return sum;
119
+ test.val(base + sum);
86
120
 
87
121
  }
88
122
 
89
123
 
90
124
 
91
- function update() {
92
-
93
- log.empty()
94
-
95
- for (var i = 0; i < values.length; i++) {
96
-
97
- log.append($('<li>').html('追加された値: ' + originalValues[i] + ' (減らされた後の値: ' + values[i] + ')'));
98
-
99
- }
100
-
101
- test.val(base + sum(values));
125
+ // `#huyasu`をクリックした時
102
-
103
- }
104
-
105
-
106
126
 
107
127
  $('#huyasu').on('click', function () {
108
128
 
109
- var rnd = Math.floor(Math.random() * 100);
129
+ var rnd = Math.floor(Math.random() * 100) + 1;
110
-
130
+
111
- values.push(rnd);
131
+ // 追加された値の配列に追加
112
132
 
113
133
  originalValues.push(rnd);
114
134
 
135
+ // もし残っている値が無いなら、
136
+
137
+ // 一番最初に追加された値ということになるのでtopValueに値をセット
138
+
139
+ if (topValue === 0) {
140
+
141
+ topValue = rnd;
142
+
143
+ }
144
+
145
+ // `#test`と`#log`の表示を更新
146
+
115
147
  update();
116
148
 
117
149
  });
118
150
 
119
151
 
120
152
 
153
+ // `#herasu`をクリックした時
154
+
121
155
  $('#herasu').on('click', function () {
122
156
 
123
- var rnd = Math.floor(Math.random() * 100);
157
+ var rnd = Math.floor(Math.random() * 100) + 1;
124
-
125
- values.unshift(-rnd);
158
+
126
-
127
- do {
128
-
129
- if (values.length === 1) break
130
-
131
- var diff = values.shift();
159
+ // 予め残っている値を減らしておく
132
-
160
+
133
- values[0] += diff;
161
+ topValue -= rnd;
134
-
162
+
135
- } while (values[0] <= 0)
163
+ // ここで残っている値が0以下なら無くなったということなのでalertしていく
136
-
164
+
137
- while (values.length < originalValues.length) {
165
+ while (topValue <= 0 && originalValues.length >= 1) {
166
+
167
+ // originalValues.shift()は配列の0番目の要素を取り出して削除し、その値を返すメソッド
138
168
 
139
169
  alert(originalValues.shift() + "が0になりました");
140
170
 
171
+ // 追加された元々の値が無くなってしまったら、
172
+
173
+ // このループは成り立たないので、
174
+
175
+ // ループから抜ける
176
+
177
+ if (originalValues.length === 0) {
178
+
179
+ break;
180
+
141
- }
181
+ }
142
-
182
+
143
- if (values.length === 1 && values[0] <= 0) {
183
+ // 次の残っている値を計算する
144
-
184
+
145
- alert(originalValues.shift() + "が0になりました");
185
+ topValue = originalValues[0] + topValue;
146
-
147
- base += values.shift();
186
+
148
-
149
- }
187
+ }
188
+
189
+ // ループを抜けたあとの残っている値が0未満だったら、
190
+
191
+ // 基準となる値を調節して、
192
+
193
+ // 残っている値が何も無い状態にする
194
+
195
+ if (topValue < 0) {
196
+
197
+ base += topValue;
198
+
199
+ topValue = 0;
200
+
201
+ }
202
+
203
+ // `#test`と`#log`の表示を更新
150
204
 
151
205
  update();
152
206
 
@@ -160,4 +214,6 @@
160
214
 
161
215
  </html>
162
216
 
217
+
218
+
163
219
  ```