JavaScript 中的分区
Partitioning in JavaScript
请考虑一个数组,例如:
arrayAll = [1,2,3,4,5,6,7,8,9]
是否有一个包可以进行分区以获得:
arrayALLPartionned = [[1,2,3],[4,5,6],[7,8,9]]
我可以看到如何使用 for 循环执行此操作,但如果存在"预制"功能,我将不胜感激。
我认为您将不得不使用 for 循环,不知道任何内置函数......
试试这个函数:
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;
}
这是一个递归解决方案:
function partition(array, n) {
return array.length ? [array.splice(0, n)].concat(partition(array, n)) : [];
}
这利用了Array#splice
破坏性地删除指定项的事实,并将它们作为函数值返回。请注意,这将销毁输入数组,使其留空。
如果使用Underscore.js,您可以使用groupBy()
和values()
来实现这一点
function partition(items, size) {
var result = _.groupBy(items, function(item, i) {
return Math.floor(i/size);
});
return _.values(result);
}
(这在CoffeeScript中不那么丑陋。
js小提琴:http://jsfiddle.net/MW3BS/
我已将此解决方案添加到@dystroy的jspref中,它的运行速度似乎是其他解决方案的两倍。编辑:在Safari和Chrome中,但不是Firefox
这是功能样式解决方案,可添加到此处的答案组合中。
它是一个称为 toPartitions
的高阶函数,它返回下划线的 reduce 方法或本机数组 reduce 方法的回调。
用法示例:
[1,2,3,4,5,6,7,8,9].reduce( toPartitions( 3 ), [] );
该函数:
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 ), [] );
}
因此,解决方案只是:
arrayALLPartionned = partition( arrayAll, 3 );
另一个解决方案,没有外部库:
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/
你可以编写自己的原型方法来做到这一点
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演示中看到它的实际效果。
Prototype 有一个 array.partition 函数和一个 eachSlice() 函数。 听起来每个Slice()都是你要找的。 如果你使用的是jquery,有一个插件可以使用原型函数。 这是它的链接...http://www.learningjquery.com/2009/02/implementing-prototypes-array-methods-in-jquery
- 用PHP/MMySQL和JavaScript填充几个HTML分区
- 使用javascript或JQuery在HTML中删除当前分区的按钮
- javascript checkbox/uncheckbox同一分区中的多个项目
- Javascript重叠-如何修复切换的显示/隐藏分区
- 如何使用Javascript更改第三分区背景颜色
- JavaScript 中的分区
- 如何在javascript中创建分区函数.使用以下准则
- Javascript循环-隐藏动画分区
- JavaScript递归实现整数分区,无需重新排列
- 如何在特定的HTML分区中显示Javascript变量
- 如何使用HTML、CSS、Javascript和If Useful JQuery创建可点击分区的坐标网格
- 在javascript中处理多个分区
- 将变量从父窗口Javascript函数传递到弹出窗口分区
- javascript中的分区位置
- HTML5/Javascript画布-用7个分区绘制圆圈
- 用javascript对链表进行分区
- 如何在多次克隆表单时使用javascript或jquery自动滚动到重点输入字段分区
- Javascript-隐藏基于文本的动态分区
- 在javascript中找到大小为2的所有分区集
- ruby on rails -如何对一个大的Javascript文件进行作用域或分区