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的语法和是使用,了解了它的多用性。对浏览器解析代码的过程和方式有了更深的了解,对性能优化有了更好的见解。

代码下载:代码

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