Agrupar array en arrays de tamaño fijo en JavaScript

Una cosa simple, pero que librerías como underscore no hacen, dejo el código de una implementación 100% nativa:

var groupEach = function (arr, n) {
    "use strict";

    var i,j, c = arr.length, result = new Array(Math.ceil(c/n));

    for (i = 0; i < c; i++) {
        j = Math.floor(i/n);
        if (!result[j]) result[j] = [];
        result[j].push(arr[i]);
    }

    return result;

};

Testeando:

> console.log(groupEach([0,1,2,3,4,5,6,7,8,9,10], 3));
[ [ 0, 1, 2 ], [ 3, 4, 5 ], [ 6, 7, 8 ], [ 9, 10 ] ]

Bueno lo busqué para compartirlo en el grupo de JavaScript ES de telegram y me di cuenta que había quedado viejo, así que acá va una versión mas nueva:

const arrWrap = (arr, wrap) => arr.reduce((res, x, i) => {
    if (!(i % wrap)) res.push([]);
    res[(i / wrap)|0].push(x);
    return res;
}, []);

Explicación

Primero que nada arrWrap es una constante que apunta a una arrow funciton que devuelve un reduce del array, donde:

(res, x, i) =>

res sería el resultado (inicializado como un Array vacío), x el elemento e i el índice del elemento dentro del array.

    if (!(i % wrap)) res.push([]);

Si i modulo de wrap no true, osea es 0 (cero), quiere decir que nos encontramos en un índice divisible por wrap, asi que en a res, le agregamos un array vacío.

    res[(i / wrap)|0].push(x);

Al resultado en el índice sobre wrap, le agregamos el elemento, la expresión |0 que sería OR 0 en binario, simplemente es un hack para transformar el resultado a entero.

Se puede testeaer acá:

https://repl.it/repls/IroncladPushyProfiler