首页 > 解决方案 > 如何置换二维数组的形状?

问题描述

我有一个从字符串生成的二维数组(调用它matrix):

131 673 234 103 018
201 096 342 965 150
630 803 746 422 111
537 699 497 121 956
805 732 524 037 331

解析后,它成为下一个数组数组:

[
  [131, 673, 234, 103, 018],
  [201, 096, 342, 965, 150],
  [630, 803, 746, 422, 111],
  [537, 699, 497, 121, 956],
  [805, 732, 524, 037, 331]
]

但是,我需要对此进行操作,以使数组变成这样:

[
  [131],
  [201,673],
  [630,096,234],
  [537,803,342,103],
  [805,699,746,965,018],
  [732,497,422,150],
  [524,121,111],
  [037,956],
  [331]
]

该数组是2-dimensional通过跟随up-left字符串或当前数组的对角线创建的数组。

我认为字符串可以被操纵(可能变成一行)并在正确的位置用换行符重建,以便我当前的代码可以工作,但是我只是想不出如何实现这一点。

要创建数组,我使用以下代码:

matrix.split("\n").reduce((a, b) =>
{
    a.push(b.split(" ").map(x => parseInt(x)));
    return a;
}, []);

matrix是保存我的字符串的变量的名称)

最好,我可以只替换我的减速器功能,但是任何解决方案都会对我大有裨益。

标签: javascriptarrays

解决方案


根据您的方法,我进行了一些修改以将内部数组的每个项目推到相应的对角线上。当我们推送一个新元素时,我使用Array::unshift()在对角线数组的开头插入。

const matrix = "131 673 234 103 018\n201 096 342 965 150\n630 803 746 422 111\n537 699 497 121 956\n805 732 524 037 331";

let res = matrix.split("\n").reduce((acc, curr, idx1) =>
{
    curr.split(" ").forEach((n, idx2) =>
    {
        // Calculate idx of the diagonal this item belongs.
        let dIdx = idx2 + idx1;

        // Insert element on the related diagonal.
        acc[dIdx] = acc[dIdx] || [];
        acc[dIdx].unshift(parseInt(n));
    });

    return acc;

}, []);

console.log(res);


推荐阅读