试图学习关键字 - 值对的JavaScript Map()对象

时间:2017-06-20 20:51:19

标签: javascript keyword-search

太多年以前,我开始研究关键字 - 值对查找算法。 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()。

我想起了一个旧漫画......

enter image description here

可以在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

0 个答案:

没有答案