快速分组javascript数组

时间:2011-07-21 19:37:21

标签: javascript arrays

我有几千个字符串的数组

['7/21/2011', '7/21/2011', '7/21/2011', '7/20/2011', etc]

我目前正在运行此代码以按字符串分组并获取最大组值:

var max = 0;
var group = {};
arr.map(function (value) {
  if (group[value]) {
    group[value]++;
  } else {
    group[value] = 1;
  }
  max = Math.max(max, group[value]);
});

是否有任何改进使这段代码运行得更快?

修改 结果位于:http://jsperf.com/javascript-array-grouping2

编辑编辑:该测试存在缺陷。 Mike Samuel 的代码是最快的。

6000条目测试 - > http://jsperf.com/javascript-array-grouping2

10K条目测试 - > http://jsperf.com/javascript-array-grouping

3 个答案:

答案 0 :(得分:9)

如果您确定这是一个热点并且速度非常重要,我会尝试通过内联maxmap来删除数千个函数调用。

您还可以通过删除比较来更快地使您的功能正文。

var max = 0;
var group = {};
for (var i = arr.length; --i >= 0;) {
  var value = arr[i];
  var n = group[value] = 1 - -(group[value] | 0);
  if (n > max) { max = n; }
}

最好的办法是衡量您关注的浏览器。

答案 1 :(得分:3)

当然可以。我会计算max last,而不是每次迭代,而不是使用if:

var group = {};
arr.map(function (value) {
    group[value] = (group[value] || 0) + 1;
});

var max = 0;
for (key in group) {
    if (group[key] > max) max = group[key];
}

编辑:正如迈克塞缪尔所说,可能通过使用索引而不是地图来加快速度:

var group = {};
var max = 0;

for (var i = arr.length; --i >= 0;) {
    group[value] = (group[value] || 0) + 1;
}
for (key in group) {
    if (group[key] > max) max = group[key];
}

答案 2 :(得分:2)

我认为这真的取决于您将运行此代码的JS引擎。另一种我认为值得一试的方法是使用

n = group[value] = (group[value]||0) + 1;
if (n > max) max = n;

每个元素。

我也认为可能使用常规循环可能会更快,因为您将使用的变量将只是本地而不是闭包的封闭变量(通常较慢)并且您还将保存函数调用元件。如果实现可以内联这个闭包,那么这两个问题都不是问题,但是我不知道是否有足够聪明的JS实现。