File tree Expand file tree Collapse file tree 6 files changed +661
-1
lines changed
18 - AddingUpTimesWithReduce Expand file tree Collapse file tree 6 files changed +661
-1
lines changed Original file line number Diff line number Diff line change
1
+ # 18 使用reduce进行时间累加
2
+
3
+ > 本篇作者:©[ 大史快跑Dashrun] ( https://github.com/dashrun ) ——Chinasoft Frontend Web Developer
4
+
5
+ > 简介:[ JavaScript30] ( https://javascript30.com ) 是 [ Wes Bos] ( https://github.com/wesbos ) 推出的一个 30 天挑战。项目免费提供了 30 个视频教程、30 个挑战的起始文档和 30 个挑战解决方案源代码。目的是帮助人们用纯 JavaScript 来写东西,不借助框架和库,也不使用编译器和引用。现在你看到的是这系列指南的第 18 篇。完整指南在 [ GitHub] ( https://github.com/soyaine/JavaScript30 ) ,喜欢请 Star 哦♪(^∇^* )
6
+
7
+ > 创建时间:2017-08-25
8
+ 最后更新:2017-08-29
9
+
10
+ ## 挑战任务
11
+ 初始文件` index-start.html ` 中提供了一个包含多个列表项的无序列表元素,每一个列表项均添加了` data-time ` 属性,该属性用** 分** 和** 秒** 表示了时间。要求将所有的时间累加在一起,并用` 时:分:秒 ` 来表示计算的结果。
12
+
13
+ ## 实现效果
14
+ ![ 结果展示] ( https://github.com/dashrun/vanilla-javascript-30/blob/master/day18-AddingUpTimesWithReduce/effects.png )
15
+
16
+ ## 基本思路
17
+ 1.取得所有` li ` 中` data-time ` 属性的值,将时间换算为秒并累加求得总时间(单位:秒);<br >
18
+ 2.手动计算将总时间转化为新的格式“XX小时XX分XX秒”;<br >
19
+ 3.将结果显示在页面上。
20
+
21
+ ## 过程指南(以非ES6版本为例)
22
+ 1.取得所有` li ` 标签
23
+ ``` js
24
+ var oLi = document .getElementsByTagName (' li' );
25
+ ```
26
+ 2.遍历` li ` 元素节点,取得每个` data-time ` 的值并以:为界将其分解为含有两个元素的数组,每个数组中含有两项,第一项为表示分钟的字符串,第二项为表示秒的字符串,将两者进行运算转化为表示秒的数字,并添加进新的数组。
27
+ ``` js
28
+ for ( var i = 0 , len = oLi .length ; i < len; i++ ){
29
+ var timeItem = oLi[i].dataset [' time' ].split (' :' );
30
+ // 将时间转换为秒
31
+ times .push (parseInt (timeItem[0 ],10 )* 60 + parseInt (timeItem[1 ],10 ));
32
+ }
33
+ ```
34
+ 3.将新数组` times ` 中各项累加
35
+ ``` js
36
+ // 方法1.因为times为数组类型,故可以直接使用reduce函数进行累加
37
+ return times .reduce (function (a ,b ){
38
+ return a+ b;
39
+ },0 );
40
+ // 方法2.不熟悉reduce函数的也可通过for循环遍历数组各项进行结果累加
41
+ ```
42
+ 4.总时间格式转换
43
+ ``` js
44
+ // 总时间对60取余即为不足1分钟的秒数
45
+ var sec = seconds % 60 ;
46
+ // 总时间除以3600并向下取整为小时数
47
+ var hour = Math .floor (seconds/ 3600 );
48
+ // 总时间减去前两项即可获得分钟数
49
+ var min = (seconds - 3600 * hour - sec)/ 60 ;
50
+ ```
51
+ 5.将结果打印在界面上即可
Original file line number Diff line number Diff line change
1
+ <!DOCTYPE html>
2
+ < html lang ="en ">
3
+ < head >
4
+ < meta charset ="UTF-8 ">
5
+ < title > Videos</ title >
6
+ </ head >
7
+ < body >
8
+ < p > 总播放时间为:< span id ="totaltime "> </ span > </ p >
9
+ < ul class ="videos ">
10
+ < li data-time ="5:43 ">
11
+ Video 1
12
+ </ li >
13
+ < li data-time ="2:33 ">
14
+ Video 2
15
+ </ li >
16
+ < li data-time ="3:45 ">
17
+ Video 3
18
+ </ li >
19
+ < li data-time ="0:47 ">
20
+ Video 4
21
+ </ li >
22
+ < li data-time ="5:21 ">
23
+ Video 5
24
+ </ li >
25
+ < li data-time ="6:56 ">
26
+ Video 6
27
+ </ li >
28
+ < li data-time ="3:46 ">
29
+ Video 7
30
+ </ li >
31
+ < li data-time ="5:25 ">
32
+ Video 8
33
+ </ li >
34
+ < li data-time ="3:14 ">
35
+ Video 9
36
+ </ li >
37
+ < li data-time ="3:31 ">
38
+ Video 10
39
+ </ li >
40
+ < li data-time ="5:59 ">
41
+ Video 11
42
+ </ li >
43
+ < li data-time ="3:07 ">
44
+ Video 12
45
+ </ li >
46
+ < li data-time ="11:29 ">
47
+ Video 13
48
+ </ li >
49
+ < li data-time ="8:57 ">
50
+ Video 14
51
+ </ li >
52
+ < li data-time ="5:49 ">
53
+ Video 15
54
+ </ li >
55
+ < li data-time ="5:52 ">
56
+ Video 16
57
+ </ li >
58
+ < li data-time ="5:50 ">
59
+ Video 17
60
+ </ li >
61
+ < li data-time ="9:13 ">
62
+ Video 18
63
+ </ li >
64
+ < li data-time ="11:51 ">
65
+ Video 19
66
+ </ li >
67
+ < li data-time ="7:58 ">
68
+ Video 20
69
+ </ li >
70
+ < li data-time ="4:40 ">
71
+ Video 21
72
+ </ li >
73
+ < li data-time ="4:45 ">
74
+ Video 22
75
+ </ li >
76
+ < li data-time ="6:46 ">
77
+ Video 23
78
+ </ li >
79
+ < li data-time ="7:24 ">
80
+ Video 24
81
+ </ li >
82
+ < li data-time ="7:12 ">
83
+ Video 25
84
+ </ li >
85
+ < li data-time ="5:23 ">
86
+ Video 26
87
+ </ li >
88
+ < li data-time ="3:34 ">
89
+ Video 27
90
+ </ li >
91
+ < li data-time ="8:22 ">
92
+ Video 28
93
+ </ li >
94
+ < li data-time ="5:17 ">
95
+ Video 29
96
+ </ li >
97
+ < li data-time ="3:10 ">
98
+ Video 30
99
+ </ li >
100
+ < li data-time ="4:43 ">
101
+ Video 31
102
+ </ li >
103
+ < li data-time ="19:43 ">
104
+ Video 32
105
+ </ li >
106
+ < li data-time ="0:47 ">
107
+ Video 33
108
+ </ li >
109
+ < li data-time ="0:47 ">
110
+ Video 34
111
+ </ li >
112
+ < li data-time ="3:14 ">
113
+ Video 35
114
+ </ li >
115
+ < li data-time ="3:59 ">
116
+ Video 36
117
+ </ li >
118
+ < li data-time ="2:43 ">
119
+ Video 37
120
+ </ li >
121
+ < li data-time ="4:17 ">
122
+ Video 38
123
+ </ li >
124
+ < li data-time ="6:56 ">
125
+ Video 39
126
+ </ li >
127
+ < li data-time ="3:05 ">
128
+ Video 40
129
+ </ li >
130
+ < li data-time ="2:06 ">
131
+ Video 41
132
+ </ li >
133
+ < li data-time ="1:59 ">
134
+ Video 42
135
+ </ li >
136
+ < li data-time ="1:49 ">
137
+ Video 43
138
+ </ li >
139
+ < li data-time ="3:36 ">
140
+ Video 44
141
+ </ li >
142
+ < li data-time ="7:10 ">
143
+ Video 45
144
+ </ li >
145
+ < li data-time ="3:44 ">
146
+ Video 46
147
+ </ li >
148
+ < li data-time ="3:44 ">
149
+ Video 47
150
+ </ li >
151
+ < li data-time ="4:36 ">
152
+ Video 48
153
+ </ li >
154
+ < li data-time ="3:16 ">
155
+ Video 49
156
+ </ li >
157
+ < li data-time ="1:10 ">
158
+ Video 50
159
+ </ li >
160
+ < li data-time ="6:10 ">
161
+ Video 51
162
+ </ li >
163
+ < li data-time ="2:14 ">
164
+ Video 52
165
+ </ li >
166
+ < li data-time ="3:44 ">
167
+ Video 53
168
+ </ li >
169
+ < li data-time ="5:05 ">
170
+ Video 54
171
+ </ li >
172
+ < li data-time ="6:03 ">
173
+ Video 55
174
+ </ li >
175
+ < li data-time ="12:39 ">
176
+ Video 56
177
+ </ li >
178
+ < li data-time ="1:56 ">
179
+ Video 57
180
+ </ li >
181
+ < li data-time ="4:04 ">
182
+ Video 58
183
+ </ li >
184
+ </ ul >
185
+ < script >
186
+ //计算总时间
187
+ var totaltime = timeTransAndReduce ( ) ;
188
+
189
+ //格式化时间并显示
190
+ timeFormatter ( totaltime ) ;
191
+
192
+ function timeTransAndReduce ( ) {
193
+ var times = [ ] ;
194
+ var oLi = document . getElementsByTagName ( 'li' ) ;
195
+ //构建时间数组
196
+ for ( var i = 0 , len = oLi . length ; i < len ; i ++ ) {
197
+ var timeItem = oLi [ i ] . dataset [ 'time' ] . split ( ':' ) ;
198
+ times . push ( parseInt ( timeItem [ 0 ] , 10 ) * 60 + parseInt ( timeItem [ 1 ] , 10 ) ) ; //将时间转换为秒
199
+ }
200
+ //累加时间并将结果返回
201
+ return times . reduce ( function ( a , b ) {
202
+ return a + b ;
203
+ } , 0 ) ;
204
+ }
205
+
206
+ //修改总时间表达式
207
+ function timeFormatter ( seconds ) {
208
+ var sec = seconds % 60 ;
209
+ var hour = Math . floor ( seconds / 3600 ) ;
210
+ var min = ( seconds - 3600 * hour - sec ) / 60 ;
211
+ document . getElementById ( 'totaltime' ) . innerHTML = hour + '小时' + min + '分' + sec + '秒' ;
212
+ }
213
+
214
+ </ script >
215
+ </ body >
216
+ </ html >
You can’t perform that action at this time.
0 commit comments