太多年以前,我开始研究关键字 - 值对查找算法。 Stackoverflow用户之后向我介绍了新的JavaScript功能,例如Map()和Iterators,它们在寻求帮助时尚未过滤到Google搜索的前端。在网站日志格式文件分析器I编码中,我用Map()替换了我的查找,性能提升非常显着。它甚至通过我的压力测试而没有崩溃。
以下是我需要正确使用Map()的一些函数,它允许我为每个关键字存储多个数据项以及组合两个Map()对象。
function add(map,keyword,datum) {
let data = map.get(keyword);
if (data) {
data.push(datum);
} else {
data = [datum];
map.set(keyword, data);
}
return data;
}
function concat(mapTo,mapNew) {
for (const [key,data] of mapNew.entries()) {
const existing = mapTo.get(key);
if (existing) {
mapTo.set(key,existing.concat(data));
} else {
mapTo.set(key,data);
}
}
}
var map = new Map();
add(map,"111.222.333.123", '111.222.333.123 HOME - [01/Feb/1998:01:08:39 -0800] "GET /bannerad/ad.htm HTTP/1.0" 200 198');
我还需要重写我的排序功能:
// Iterate through Map of referring websites and compress resource list
for (const [keyword,data] of this.referrersMap.entries()) {
const map = new Map(),
resources = [];
// Remove duplicate resource entries for this referrer
data.forEach(function(e) {
add(map,e,void 0); // Choosing typeof 'undefined' is arbitrary.
});
for (const [key,data2] of map.entries()) { // data2 for clarity
resources.push({
keyword: key,
count: data2.length
});
}
resources.sort(function(a,b) {
a = a.count;
b = b.count;
if (a > b) return -1;
if (b > a) return 1;
return 0;
});
// Continue processing
}
现在我担心的是,在实施更改并让它在Chrome中运行后,我了解到Microsoft Internet Explorer是不兼容的?让我们看看...... MSIE不喜欢for..of循环,而是必须使用Map.forEach()。
我想起了一个旧漫画......
可以在skewsme.com/webloghog.html找到完整的源代码,这里有一些可以粘贴到其中的示例日志格式。
111.222.333.123 HOME - [01/Feb/1998:01:08:39 -0800] "GET /bannerad/ad.htm HTTP/1.0" 200 198
111.222.333.123 HOME - [01/Feb/1998:01:08:46 -0800] "GET /bannerad/ad.htm HTTP/1.0" 200 28083
111.222.333.123 AWAY - [01/Feb/1998:01:08:53 -0800] "GET /bannerad/ad7.gif HTTP/1.0" 200 9332
111.222.333.123 AWAY - [01/Feb/1998:01:09:14 - 0800] "GET /bannerad/click.htm HTTP/1.0" 200 207