如何从单个数组创建数组集合?

And*_*ndy -1 javascript arrays underscore.js

说我有一个大阵列

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]
Run Code Online (Sandbox Code Playgroud)

并希望将其拆分为一组像n元组一样的元组

[[1,2], [3,4], [5,6], [7,8], [9,10], [11,12], [13,14] /*, ... */ ] // (for n=2)
Run Code Online (Sandbox Code Playgroud)

有没有简单的方法来实现这一目标?特殊情况n = 2对我来说已经足够了.

elc*_*nrs 5

这应该工作:

for (var i=0; i<arr.length; i+=2) {
  result.push([arr[i], arr[i+1]]);
}
Run Code Online (Sandbox Code Playgroud)

想到这一点,它应该适用于任何数量的"口袋"或任何你想要称之为的东西.它检查undefined所以它适用于奇数项目:

Array.prototype.pockets = function(n) {

  var result = [],
      pocket = [],
      i, j;

  for (i=0; i<this.length; i+=n) {
    pocket.length = 0;
    for (j=1; j<n; j++) if (this[i+j] != null) pocket.push(this[i+j]);
    result.push([this[i]].concat(pocket));
  }

  if (arguments.length > 1) {
    return result.pockets.apply(result, [].slice.call(arguments,1));
  }

  return result;
};

// Usage:
var arr = [1,2,3,4,5,6,7,8,9,10,11];

arr.pockets(2); //=> [[1,2],[3,4],[5,6],[7,8],[9,10],[11]]
arr.pockets(3); //=> [[1,2,3],[4,5,6],[7,8,9],[10,11]]

// Recursive:
arr.pockets(1,3); //=> [ [[1],[2],[3]], [[4],[5],[6]], [[7],[8],[9]], [[10],[11]] ]
Run Code Online (Sandbox Code Playgroud)


lqc*_*lqc 5

通过使用可以更简单地完成此操作Array.slice:

function grouper(lst, size) {
    var result = [], i=0, n=lst.length;
    while(i < n) {
        result.push(lst.slice(i, i+size));
        i += size;
    }
    return result
}
Run Code Online (Sandbox Code Playgroud)

它的效率也更高:http://jsperf.com/grouper