在JavaScript中进行分区

请考虑一个数组,如:

arrayAll = [1,2,3,4,5,6,7,8,9] 

是否有一个包可以做分区来获得:

 arrayALLPartionned = [[1,2,3],[4,5,6],[7,8,9]] 

我可以看到如何使用for循环做到这一点,但是如果存在的话,将会感激“预制”function。

如果使用groupBy() ,你可以用groupBy()values()

 function partition(items, size) { var result = _.groupBy(items, function(item, i) { return Math.floor(i/size); }); return _.values(result); } 

(这在CoffeeScript中不太难看。)

jsFiddle: http : //jsfiddle.net/MW3BS/

我想你将不得不使用for循环,不知道任何内置函数…

试试这个function:

 function splitarray(input, spacing) { var output = []; for (var i = 0; i < input.length; i += spacing) { output[output.length] = input.slice(i, i + spacing); } return output; } 

这是一个recursion的解决scheme:

 function partition(array, n) { return array.length ? [array.splice(0, n)].concat(partition(array, n)) : []; } 

这利用了Array#splice破坏性地移除指定项目并将其作为函数值返回的事实。 请注意,这将破坏input数组,使其为空。

还有一个解决scheme,没有外部库:

 function partition(items, size) { var p = []; for (var i=Math.floor(items.length/size); i-->0; ) { p[i]=items.slice(i*size, (i+1)*size); } return p; } 

示范: http : //jsfiddle.net/dystroy/xtHXZ/

我已经在@ dystroy的jspref这里添加了这个解决scheme,它的运行速度是其他解决scheme的两倍。 编辑:在Safari和Chrome中,但不是Firefox

这里是function风格的解决scheme,以添加到这里的答案组合。

这是一个高阶函数,称为toPartitions ,它返回下划线的reduce方法或本地数组reduce方法的callback。

用法示例:

 [1,2,3,4,5,6,7,8,9].reduce( toPartitions( 3 ), [] ); 

function:

 function toPartitions ( size ) { var partition = []; return function ( acc, v ) { partition.push( v ); if ( partition.length === size ) { acc.push( partition ); partition = []; } return acc; }; } 

就像Clojure的分区一样,当没有足够的元素的时候,它不会包含尾部分区。

在你的例子中,你可以这样做:

 arrayALLPartionned = arrayAll.reduce( toPartitions( 3 ), [] ) ); 

如果你不想使用这个reduce ,但只是有一个函数,它需要一个数组和分区大小,你可以做:

 function partition ( arr, size ) { return arr.reduce( toPartitions( size ), [] ); } 

因此,解决scheme将是:

 arrayALLPartionned = partition( arrayAll, 3 ); 

Prototype有一个array.partition函数以及一个eachSlice()函数。 听起来像eachSlice()是你在找什么。 如果你使用的是jQuery,那么可以使用原型函数。 这是一个链接… http://www.learningjquery.com/2009/02/implementing-prototypes-array-methods-in-jquery

你可以写你自己的原型方法来做到这一点

 Array.prototype.partition = function(length) { var result = []; for(var i = 0; i < this.length; i++) { if(i % length === 0) result.push([]); result[result.length - 1].push(this[i]); } return result; }; 

如果你不想添加到原生的原型,你可以写一个简单的函数:

 var partition = function(arr, length) { var result = []; for(var i = 0; i < arr.length; i++) { if(i % length === 0) result.push([]); result[result.length - 1].push(arr[i]); } return result; }; 

你可以看到它在这个jsFiddle演示中的行动 。