3

在 javascript 中,有没有一种简单的方法来合并 2 个数组,就像洗牌一样?

例如:

[“1”、“2”、“3”]+[“a”、“b”、“c”]

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

4

4 回答 4

3

此操作通常称为“ zip ”。

Underscore.js有一个实现

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

如果你想要一个随机顺序,你可以使用shuffle

var shuffled = _.shuffle(a1.concat(a2));
于 2013-10-01T05:03:28.820 回答
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"]
于 2013-10-01T05:04:25.137 回答
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]; };

这种方法的好处是您不会一次构建所有元素,而是仅在请求时才从原始数组中获取元素。

这也允许对aand使用函数而不是数组b

c = function(i){ return (i & 1) ? b(i >> 1) : a(i >> 1); };
于 2013-10-01T05:44:58.833 回答
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);
于 2013-10-01T05:11:24.643 回答