преобразование массива в массив массивов размера N, но с максимальным размером подмассива - PullRequest
0 голосов
/ 30 декабря 2018

Я пытаюсь преобразовать массив в массивы равного размера длиной n , однако количество массивов не может превышать размер o .если массив не может быть разбит на длину n без превышения o массива массивов, то n может увеличиться, чтобы приспособиться к уменьшению количества массивов массивов до о .Любые массивы не n должны быть смещены в начало массива массивов.при желании каждый элемент должен быть в состоянии объединяться

Примечание: я использую числа для визуализации вопроса, но элементы являются объектами.

например: круглые скобки массива примечания: {}, [], () в этих примерах для упрощения визуализации

var arr = [0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5], n = 2, o = 15
var shouldOutput = [{0,1},{2,3},{4,5},{6,7},{8,9},{0,1},{2,3},{4,5}]

arr = [1,2,3,4,5,6,7,8,9,0,1,2,3,4,5], n = 2, o = 15
var shouldOutput = [{1},{2,3},{4,5},{6,7},{8,9},{0,1},{2,3},{4,5}]

var arr = [01,23,45,67,89,01,23,45,67,89,01,23,45,67,89,01,23], n = 2, o = 15, concatenate = true 
var shouldOutput = [({01})({2345})({6789})({0123})({4567})({8901})({2345})({6789})({0123})]

до сих пор у меня есть следующий код, который будет корректно генерировать массив массивов с длиной n и правильно выталкивает все остальные элементы вначало массива, но я не уверен, как перейти к ограничению длины массива массивов до o длины.

let getArrChunks = function (arr, n, o, joinStr) {
    let ret = [];
    let max = Math.floor(arr.length / n);
    if ((arr.length % n) > 0) max++;
    for (let i = arr.length - n; i > -n; i -= n) {
        ret[(max--)-1] = joinStr === undefined ? arr.splice(i, n) : arr.splice(i, n).join(joinStr);
    }
    return ret;
};

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

Размер для каждого подмассива (кроме, может быть, первого) является результатом этого выражения:

Math.max(n, Math.ceil(arr.length / o))

Если вышеприведенное выражение переназначено на n , торазмер подмассива first :

arr.length % n  

... за исключением случаев, когда это выражение равно нулю, в этом случае первый подмассив имеет тот же размер, что и остальные, т.е. n

Используется в этой демонстрации:

const getArrChunks = function (arr, n, o, joinStr) {
    n = Math.max(n, Math.ceil(arr.length / o)); // n is here increased if necessary
    const first = arr.slice(0, arr.length % n);
    const ret = first.length ? [joinStr === undefined ? first : first.join(joinStr)] : [];
    for (let i = first.length; i < arr.length; i += n) {
        ret.push(joinStr === undefined ? arr.slice(i, i+n) : arr.slice(i, i+n).join(joinStr));
    }
    return ret;
};

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

Обратите внимание, что звонка на splice нет, но на slice.Таким образом, данный входной массив не видоизменяется.

0 голосов
/ 30 декабря 2018

Если все, что вам нужно сделать, это ограничить длину массива, вы можете использовать Array.prototype.splice():

ret = ret.splice(0, o);
return ret;

Полный код:

let getArrChunks = function (arr, n, o, joinStr) {
    let ret = [];
    let max = Math.floor(arr.length / n);
    if ((arr.length % n) > 0) max++;
    for (let i = arr.length - n; i > -n; i -= n) {
        ret[(max--)-1] = joinStr === undefined ? arr.splice(i, n) : arr.splice(i, n).join(joinStr);
    }
    ret = ret.splice(0, o);
    return ret;
};
...