在JavaScript中进行分区

500*_*500 13 javascript list

请考虑一个数组,如:

arrayAll = [1,2,3,4,5,6,7,8,9]
Run Code Online (Sandbox Code Playgroud)

是否有一个允许进行分区以获取的包:

arrayALLPartionned = [[1,2,3],[4,5,6],[7,8,9]]
Run Code Online (Sandbox Code Playgroud)

我可以看到如何使用for循环执行此操作,但如果存在,则会欣赏"预制"功能.

sta*_*abs 13

我想你将不得不使用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;
}
Run Code Online (Sandbox Code Playgroud)

  • 这与接受的答案一样简单,并且不依赖于任何外部库.+1 (3认同)
  • 使用`slice`可以避免一个循环. (2认同)

mil*_*ose 11

如果使用Underscore.js,您可以使用groupBy()和实现它values()

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

(这在CoffeeScript中不那么难看.)

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

  • 该分区函数仅将数组拆分为两个. (4认同)
  • 请注意,Underscore.js现在具有分区功能:http://underscorejs.org/#partition (2认同)

小智 9

这是一个递归解决方案:

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

这利用了Array#splice破坏性地删除指定项的事实,并将它们作为函数值返回.请注意,这将破坏输入数组,使其为空.


Ros*_*oss 6

我已将此解决方案添加到@dystroy 的 jspref 中,它的运行速度似乎是其他解决方案的两倍。编辑:在 Safari 和 Chrome 中,但不在 Firefox 中

这是功能风格的解决方案,可添加到此处的答案组合中。

它是一个被调用的高阶函数toPartitions,它返回下划线的reduce方法或本机数组reduce方法的回调。

用法示例:

[1,2,3,4,5,6,7,8,9].reduce( toPartitions( 3 ), [] );
Run Code Online (Sandbox Code Playgroud)

功能:

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

与 Clojure 的分区一样,当元素不足时,它不会包含尾部分区。

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

arrayALLPartionned = arrayAll.reduce( toPartitions( 3 ), [] ) );
Run Code Online (Sandbox Code Playgroud)

如果您不想将其与 一起使用reduce,而只是有一个需要数组和分区大小的函数,您可以这样做:

function partition ( arr, size ) {
    return arr.reduce( toPartitions( size ), [] );
}
Run Code Online (Sandbox Code Playgroud)

因此解决方案就是:

arrayALLPartionned = partition( arrayAll, 3 );
Run Code Online (Sandbox Code Playgroud)