我有一个以[a, b, c, d, e, f ... ]
格式从API返回的数组,其中a,c,e
和b,d,f
的类型相同。现在我想将数组分组为[ [a,b], [c,d], [e,f] ...]
。通过创建一个新数组相当容易,但数组很大,因此可能很慢。
所以我想知道是否有任何可以在现场进行的方法?
答案 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;元素通过在它们到达之前拼接它们。
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;
就性能而言未经测试。我同意这些评论,它很可能在适当的位置操纵阵列,因为建立一个新的阵列。