Javascript/Typescript: 使用 map/reduce 从其他数组生成新数组?

Javascript/Typescript: Generate new arrays from other arrays with map / reduce?

两天前我就被这个问题弄疯了。

我有一个数组数组,就像这样(数组的数量可以改变,它们的元素的数量也可以改变,但是为了得到背后的东西让我们假设这个例子):

array = [ ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18"], ["19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36"], ["37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54"] ];

我只想创建一个新数组,其中包含一些如下所示的数组:

result = [ ["1", "19", "37"], ["2", "20", 38"], ... ];

我通过一些 foreach 循环得到了这个,但我想知道如何使用 map() 和 reduce() 来做到这一点。 我尝试并得到了一些结果,但离我需要的还很远。

有人可以帮助我吗?

提前致谢, 干杯

您可以迭代数组并更改外部 i 和内部 j 索引以分配实际值。

//                                                v--------v------v
result = array.reduce((r, a, i) => (a.forEach((v, j) => (r[j] = r[j] || [])[i] = v), r), []);
//                           ^----------------------------------------------^

var array = [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18"], ["19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36"], ["37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54"]],
    result = array.reduce((r, a, i) => (a.forEach((v, j) => (r[j] = r[j] || [])[i] = v), r), []);
    
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

显式检查和分配空数组。

var array = [["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18"], ["19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36"], ["37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54"]],
    result = array.reduce((r, a, i) => {
        a.forEach((v, j) => {
            if (!(j in r)) {
                r[j] = [];
            }
            r[j][i] = v;
        });
        return r;
    }, []);
    
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }