将一个数组转换为N个大小但最大子数组大小的数组

时间:2018-12-29 22:56:00

标签: javascript arrays object multidimensional-array split

我正在尝试将数组转换为长度为 n 的相等大小的数组,但是,数组的数量不能超过 o 的大小。 如果不能在不超过 o 个数组的情况下将数组拆分为 n 个长度,则 n 可以增加以适应将数组的数目减少为 o 。 任何非 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 :(得分:3)

每个子数组(也许第一个除外)的大小是该表达式的结果:

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。这样,给定的输入数组就不会突变。

答案 1 :(得分:0)

如果您只想限制数组的长度,则可以使用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;
};