JS 如何多个一维Array 竖向拼成新的二维Array

比如有 这样的几个Array

a = [1,2,3,4,5]
b = [11,22,33,44,55]
c = [111,222,333,444,555]

想要转成下面这种

newArray = [
[ 'A','B','C'],  -〉可以先不考虑这个。后面可以再拼接。
[ 1, 11, 111],
[ 2, 22, 222],
[ 3, 33, 333],
[ 4, 44, 444],
[ 5, 55,555]
]

a,b,c 的长度是动态的

一时半会没想到 要怎么样来写这个循环。还要在循环里创建空的进行添加。

求大牛指教。

阅读 2.5k
3 个回答

image.png

a = [1,2,3,4,5]
b = [11,22,33,44,55]
c = [111,222,333,444,555]

a.map((v,i)=>[a,b,c].map(v=>v[i]))

没难度,来下一题

楼上给出了很好的解决方案,我这里使用reduce换种写法

const a = [1, 2, 3, 4, 5]
const b = [11, 22, 33, 44, 55]
const c = [111, 222, 333, 444, 555]

const arr = a.reduce((accu, cur, index) => {
    accu.push([a,b,c].map((v) => v[index]));
    return accu
}, []);
console.log(arr);

控制台执行结果

不久前才回答了一个 Java 的类似问题

不过 JS 比 Java 灵活,用 JS 来写会更简单,步骤就是

  1. 由于不定长,找到最长的那个元素(如果 a, b, c 数组长度相同,就不需要了,随便取一个就行)
  2. 然后按这个长度循环,依次从 a, b, c 三个数组中取一个出来拼成新的数组。

对于 JS 来说,索引超出范围不会出错,只会返回 undefined,所以不用担心这个问题。

示例:

const a = [1, 2, 3, 4, 5];
const b = [11, 22, 33, 44, 55];
const c = [111, 222, 333, 444, 555];

function transform(...args) {
    // 找最大长度
    const length = Math.max(...args.map(a => a.length));
    // 转置
    const matrix = Array.from({ length })
        .map((_, i) => args.map(a => a[i]));
    
    // 前面补列首
    matrix.unshift(args.map((_, i) => String.fromCharCode(65 + i)));
    return matrix;
}

console.log(transform(a, b, c));

如果不要列首,稍做重构,代码看起来还是很精简的

function transform(...args) {
    return Array
        .from({ length: Math.max(...args.map(a => a.length)) })
        .map((_, i) => args.map(a => a[i]));
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏