javascript中数组中的快速组项

时间:2015-06-08 03:41:58

标签: javascript arrays

我有一个以[a, b, c, d, e, f ... ]格式从API返回的数组,其中a,c,eb,d,f的类型相同。现在我想将数组分组为[ [a,b], [c,d], [e,f] ...]。通过创建一个新数组相当容易,但数组很大,因此可能很慢。

所以我想知道是否有任何可以在现场进行的方法?

3 个答案:

答案 0 :(得分:1)

你想要它在2个部分块吗?

var o    = ['a', 'b', 'c', 'd', 'e', 'f'],
    size = 2, i, ar   = []; // The new array

for (i = 0; i < o.length; i += size) ar.push(o.slice(i,i + size));

现在,ar是:

[
    ['a', 'b'],
    ['c', 'd'],
    ['e', 'f']
]

无论你怎么做,总会有一些循环。编译器必须遍历所有数组元素才能生成新数组。

速度测试

所以我用这个创建一个数组:

var l = 10000000, // The length
    o = [], j;
for (j = 0; j < l; j += 1) o.push(j);

这样就可以生成一个带l项的数组来测试速度:

var start = performance.now(),
    size = 2, ar = [];
for (i = 0; i < o.length; i += size) ar.push(o.slice(i,i + size));
console.log(performance.now() - start);

试验:

  

100千: 0.092909533996135秒

     

1百万: 0.359059600101318秒

     

1000万: 10.138852232019417秒

1000万次的时间可能会让人大吃一惊但是如果你拥有那么大的阵列,你会遇到更大的问题,例如内存问题。如果这个阵列来自服务器,你可能会对服务器造成过大压力。

答案 1 :(得分:1)

即使op关注性能,这是对库的肆意使用,但我喜欢使用lodash / underscore来轻松理解代码:

_.partition('a,b,c,d,e,f'.split(','), function(_, idx) {return !(idx % 2);})

答案 2 :(得分:1)

现场解决方案是正常迭代,构建数组并跳过&#39;元素通过在它们到达之前拼接它们。

DEMO

&#13;
&#13;
var arr = ['a', 'b', 'c', 'd', 'e', 'f'];

function compact (arr) {
  for(var i = 0; i < arr.length; i++) {
    arr[i] = [arr[i], arr[i + 1]];
    arr.splice(i + 1, 1);
  }
  
  return arr; // debug only
}

console.log(compact(arr.slice()));
// >> [["a", "b"], ["c", "d"], ["e", "f"]]
&#13;
&#13;
&#13;

就性能而言未经测试。我同意这些评论,它很可能在适当的位置操纵阵列,因为建立一个新的阵列。