javascript+Ajax實現統計文本(30Kb~300Kb)各詞出現頻率,並把前十打印出來

1.首先要讀取文本,第一想到的就是Ajax。它可以很好的動態的向服務器發起請求。通過XmlHttpRequest 使您可以使用 JavaScript 向服務器提出請求並處理響應,而不阻塞用戶。所以首先要建立一個Apache服務器(我這裏使用的是wamp).(注:要看效果請訪問本地服務器:如http://localhost/read_txt.html,啓動瀏覽器控制檯:按F12)

這裏文本只取了18.3K。。。


2.接下來,就要封裝了一個Ajax函數(也可以使用jQuery,這裏使用js);

步奏:1.創建Ajax對象 2連接到服務器 3.發送請求 4接受返回值,根據監聽其狀態(成功或失敗)響應返回。代碼如下:

3.最後調用Ajax讀取文檔(a.txt)


,用javascript的split()方法進行分割,並通過正則表達式進行符號的替換

下面是部分主要代碼

var strArr=str.split(" "); //字符串分割
var reg=/,|\.|\?|!|:|;|\r/g;//正則

str=strArr[i].replace(reg,'').toLowerCase(); //正則匹配並轉爲小寫
result.push(str); //放進result數組

構造鍵值對:


存放並排序單詞:


構造對象存儲單詞與次數

最後打印出即可


結果

性能分析:


對上圖的解釋:

對上面的時間線記錄的數據來看,消耗瀏覽器資源最多的就是 解析HTML(parse HTML)和函數調用(function call).並且渲染HTML樣式所用的時間是加載HTML代碼的4倍左右!而其子函數的調用所用的時間是主函數的3倍多!

關於性能優化的思考:

對以上問題 1.考慮到由於是測試,所以Javascript代碼,採用的是內聯樣式,不利於佈局和解析(應該像Ajax函數一樣,封裝起來,並在外部引用)。

  2.由於瀏覽器是單線程、且是事件驅動的,所以採用異步編程(或者說非阻塞式編程),將會大大減少對瀏覽器的負擔(詳情,見我的另一篇 blog : javascript異步加載方式方法與思考)

改進:單詞過濾

加上了一個數組:var f=["the","is","to","a","of","this","in","and","for"];來存放要過濾的單詞,push進數組的時候再做一個判斷,但發現,前10還是不是重要單詞,介詞什麼的太多了!

總結:通過本次試驗,我熟悉瞭如何使用Ajax異步加載txt文檔,並提取裏面的內容,使用javascript進行劃分,並打印出頻率最高的前十個,讓我再次熟悉了javascript的語法和是使用,瞭解了它的多用性。對瀏覽器解析代碼的過程和方式有了更深的瞭解,對性能優化有了更好的見解。

代碼下載:代碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章