在javascript中,是否有一种简单的方法来合并2个数组,就像洗牌一样?合并两个阵列就好像洗牌一样没有迭代?
例如:
[ “1”, “2”, “3”] + [ “一”, “B”, “C”]
=> [ “1”, “a”,“2”,“b”,“3”,“c”]
在javascript中,是否有一种简单的方法来合并2个数组,就像洗牌一样?合并两个阵列就好像洗牌一样没有迭代?
例如:
[ “1”, “2”, “3”] + [ “一”, “B”, “C”]
=> [ “1”, “a”,“2”,“b”,“3”,“c”]
此操作通常称为“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));
这很漂亮。谢谢 – user1031947
虽然这仍然实现了迭代。 – mavrosxristoforos
多数民众赞成在一个循环,这是一种愚蠢的问题,因为即使JavaScript有这样的功能,它仍然是幕后循环 – y0ruba
var arr1 = ["1", "2", "3"];
var arr2 = ["a", "b", "c"];
你可以通过数组循环,创建一个新的。此示例假定arr1
和arr2
长度相同。
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"]
你不能没有迭代就能做到,但你可以隐藏一些数组函数后面的迭代。
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);
可以创建可以用来作为数组用于读取(即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]; };
这种方法的好处在于,您不需要一次构建所有元素,只需要时就可以从原始数组中获取元素。
这也允许使用的功能,而不是阵列的a
和b
:
c = function(i){ return (i & 1) ? b(i >> 1) : a(i >> 1); };
你可以不用循环最好是'a.concat(B)'我想 – y0ruba
这不会打乱它虽然,像他的例子指定。我怀疑有没有一种干净的方式来做到这一点没有迭代 –
@ThomasWood我说你最好可以得到,你不能没有循环shuffle – y0ruba