You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript实现:将行式排列的二维数组转换为指定竖式排布的二维数组

JavaScript实现:将行式排列的二维数组转换为指定竖式排布的二维数组

嘿,我终于搞懂你要的转换逻辑啦!你之前用扁平化数组的思路是完全正确的,只是后续的分组和排列逻辑需要调整一下,咱们来一步步实现这个需求:

核心思路

你的需求本质是把扁平化后的有序数组,先分成和原输入列数相同的若干组,再将这些组转置,最后过滤掉每一行里的空值,就能得到想要的结果。具体步骤如下:

  1. 将输入的二维数组扁平化为一维有序数组;
  2. 按照原输入的列数,把一维数组分成若干子组,子组的长度尽可能均匀(前几个组长度多1,剩下的组长度少1);
  3. 转置这些子组组成的二维数组;
  4. 过滤掉转置后每一行里的undefined值,得到最终结果。

完整实现代码

function convert(input) {
    // 步骤1:扁平化输入数组
    const flat = input.flat();
    const total = flat.length;
    const cols = input[0].length;
    
    if (cols === 0) return [];
    
    // 步骤2:计算分组大小并创建分组
    const groupSize = Math.ceil(total / cols);
    const remainder = total % cols;
    const groups = [];
    let currentIndex = 0;
    
    for (let i = 0; i < cols; i++) {
        // 前remainder个组的长度是groupSize,剩下的是groupSize-1
        const currentGroupSize = i < remainder ? groupSize : groupSize - 1;
        groups.push(flat.slice(currentIndex, currentIndex + currentGroupSize));
        currentIndex += currentGroupSize;
    }
    
    // 步骤3:转置分组并过滤空值
    const result = [];
    for (let i = 0; i < groupSize; i++) {
        const row = groups.map(group => group[i]).filter(val => val !== undefined);
        result.push(row);
    }
    
    return result;
}

// 测试第一个例子
const input1 = [[0, 1, 2], [3, 4, 5], [6]];
console.log(convert(input1)); // 输出: [[0, 3, 5], [1, 4, 6], [2]]

// 测试第二个例子
const input2 = [[0, 1, 2, 3, 4], [5, 6]];
console.log(convert(input2)); // 输出: [[0, 2, 4, 5, 6], [1, 3]]

代码说明

  • 扁平化数组:用Array.flat()快速将二维数组转为一维,如果你需要兼容旧环境,可以替换成input.reduce((acc, curr) => acc.concat(curr), []);
  • 分组逻辑:根据总元素数和原列数,计算每个子组的长度,保证分组尽可能均匀,避免出现某组长度过大的情况;
  • 转置与过滤:通过遍历每个子组的对应索引来实现转置,同时用filter去掉转置后出现的undefined值,保证结果数组里没有空元素。

备注:内容来源于stack exchange,提问作者Gold Chicken

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 03:23:24