2013-10-01 17 views
2

在javascript中,是否有一种简单的方法来合并2个数组,就像洗牌一样?合并两个阵列就好像洗牌一样没有迭代?

例如:

[ “1”, “2”, “3”] + [ “一”, “B”, “C”]

=> [ “1”, “a”,“2”,“b”,“3”,“c”]

+0

你可以不用循环最好是'a.concat(B)'我想 – y0ruba

+1

这不会打乱它虽然,像他的例子指定。我怀疑有没有一种干净的方式来做到这一点没有迭代 –

+0

@ThomasWood我说你最好可以得到,你不能没有循环shuffle – y0ruba

回答

2

此操作通常称为“zip”。

Underscore.js有它的一个implementation

var a1 = [ "1", "2", "3" ]; 
var a2 = [ "a", "b", "c" ]; 
var zipped = _.zip(a1, a2); 

如果你想有一个随机命令,你可以使用shuffle

var shuffled = _.shuffle(a1.concat(a2)); 
+1

这很漂亮。谢谢 – user1031947

+1

虽然这仍然实现了迭代。 – mavrosxristoforos

+4

多数民众赞成在一个循环,这是一种愚蠢的问题,因为即使JavaScript有这样的功能,它仍然是幕后循环 – y0ruba

2
var arr1 = ["1", "2", "3"]; 
var arr2 = ["a", "b", "c"]; 

你可以通过数组循环,创建一个新的。此示例假定arr1arr2长度相同。

var result = (function(a, b){ 
    for(var i = 0, result = []; i < a.length; i++) 
    result.push(a[i], b[i]); 
    return result; 
})(arr1, arr2); 

// result == ["1", "a", "2", "b", "3", "c"] 
0

你不能没有迭代就能做到,但你可以隐藏一些数组函数后面的迭代。

var a = [ "1", "2", "3" ]; 
var b = [ "a", "b", "c" ]; 

// only works if a and b have the same length 
var c = a.concat(b).map(function(item, index, arr){ 
    return index % 2 ? arr[arr.length/2 + (index+1)/2 - 1] : arr[index/2]; 
}); 

console.log(c); 
0

可以创建可以用来作为数组用于读取(即c(i)返回结果的i个元素)的闭合:

c = function(i){ return [a, b][i & 1][i >> 1]; }; 

,或者可能更有效,因为

c = function(i){ return (i & 1) ? b[i >> 1] : a[i >> 1]; }; 

这种方法的好处在于,您不需要一次构建所有元素,只需要时就可以从原始数组中获取元素。

这也允许使用的功能,而不是阵列的ab

c = function(i){ return (i & 1) ? b(i >> 1) : a(i >> 1); };