實用範例: 統計加總
從 lastlog.txt 資料檔讀入資料:
fs = require('fs') # 這句僅適用於 nodejs
lastLog = fs.readFileSync('lastlog.txt', 'utf8').split('\n')
lastLog.length
lastLog[50]
lastLog[50].match(/^(\w+)/)[1]
lastLog.map(function (x) { return x.match(/^(\w+)/)[1]; }) # 為何有錯誤訊息?
lastLog.length
lastLog = lastLog.filter(function (x) { return x.match(/^(\w+)/); })
lastLog.length
lastLog = lastLog.map(function (x) { return x.match(/^(\w+)/)[1]; })
# 再來一次就成功了; 也把它存起來
第一階段目標是想要先建立這樣的資料結構:
> raw
[ { id: 'm9426034',
hour: '00',
min: '02' },
{ id: 'm9426034',
hour: '00',
min: '04' },
{ id: 'm9426034',
hour: '00',
min: '01' },
{ id: 'm9426027',
hour: '00',
min: '38' },
...
{ id: 'm9426046',
hour: '01',
min: '06' },
{ id: 'm9426018',
hour: '01',
min: '49' },
{ id: 'm9426029',
hour: '00',
min: '02' } ]
這個用一句 map 就完成了:
raw = lastLog.map(function (x) { m=x.match(/^(\w+).*\((\d\d):(\d\d)\)/);
return {'id':m[1],'hour':m[2],'min':m[3]} } )
第二階段的目標是想要建立這樣的資料結構:
> stat
{ m9426034: { freq: 12, time: 394 },
m9426027: { freq: 24, time: 476 },
m9426009: { freq: 5, time: 310 },
m9426020: { freq: 7, time: 354 },
...
m9426031: { freq: 11, time: 272 },
m9426028: { freq: 9, time: 214 },
m9426005: { freq: 4, time: 229 } }
先練習一下如何操作 hash:
stat = {}
stat['greg'] = { 'freq':1, 'time':173 }
++stat['greg']['freq']; stat['greg']['time']+=94
'greg' in stat
'abc' in stat
所以可以這樣產生 stat:
stat = {}
raw.forEach(function (x) { id=x['id']; t=parseInt(x['hour'])*60+parseInt(x['min']); if (id in stat) { ++stat[id]['freq']; stat[id]['time']+=t; } else { stat[id] = { 'freq':1, 'time':t }; } } )
但是 hash 不方便排序; 陣列則有現成的函數可以排序。 所以想要把 stat 這個 hash 轉成 stat2 這樣的陣列:
> stat2
[ { id: 'm9426007',
freq: 6,
time: 72 },
{ id: 'm9426013',
freq: 6,
time: 149 },
{ id: 'm9426033',
freq: 6,
time: 154 },
{ id: 'm9426028',
freq: 9,
time: 214 },
...
{ id: 'm9426046',
freq: 21,
time: 1172 },
{ id: 'm9426002',
freq: 10,
time: 1604 },
{ id: 'm9426040',
freq: 24,
time: 1831 } ]
這也是用一個迴圈就可以完成。
要如何對 stat 這個 hash 裡面的每個元素做一些事呢?
用 for (k in stat) { ... }
在迴圈裡面, k 每次會變成 stat 的一個 key。
stat2 = []
for (k in stat) { stat2.push({'id':k,'freq':stat[k]['freq'],'time':stat[k]['time']}); }
最後, 就可以對 stat2 這個陣列按照 freq 或按照 time 來排序了:
stat2.sort(function(a,b){return a['freq']-b['freq'];})
stat2.sort(function(a,b){return b['freq']-a['freq'];})
stat2.sort(function(a,b){return a['time']-b['time'];})
stat2.sort(function(a,b){return b['time']-a['time'];})
- 本頁最新版網址: https://frdm.cyut.edu.tw/~ckhung/b/js/counting.php; 您所看到的版本: April 11 2016 06:42:02.
- 作者: 朝陽科技大學 資訊管理系 洪朝貴
- 寶貝你我的地球, 請 減少列印, 多用背面, 丟棄時做垃圾分類。
- 本文件以 Creative Commons Attribution-ShareAlike License 或以 Free Document License 方式公開授權大眾自由複製/修改/散佈。
![[rss feed 圖案]](/~ckhung/i/rss.png)