如何向多维数组添加指定值并复制元素以生成目标数组?
从数组a生成目标数组b的解决方案
原数组与目标结构
原输入数组:
var a = [['Dog','Cat'],[1,2]];
需要生成的目标数组:
var b = [['G','X','G','X'], ['Dog','Dog', 'Cat', 'Cat'],[1,1,2,2]];
原代码的问题
你之前的循环逻辑存在两个核心问题:
- 未初始化数组
b,直接对b[0][j]赋值会导致报错 - 每次循环都覆盖了同一位置的元素,没有为每个原数组元素创建
G和X对应的两个位置,无法实现元素重复的需求
你的预期执行逻辑是正确的:原数组中每一列的元素(比如a[0][0]和a[1][0])需要对应目标数组中的两组数据——一组前缀G,一组前缀X,按列依次处理即可。
正确实现代码
基础循环实现
var a = [['Dog','Cat'],[1,2]]; // 先初始化目标数组的三个空数组 var b = [[], [], []]; // 遍历原数组的列(先处理Dog&1,再处理Cat&2) for (let j = 0; j < a[0].length; j++) { // 添加G对应的一组数据 b[0].push('G'); b[1].push(a[0][j]); b[2].push(a[1][j]); // 添加X对应的一组数据 b[0].push('X'); b[1].push(a[0][j]); b[2].push(a[1][j]); } console.log(b); // 输出结果:[['G','X','G','X'], ['Dog','Dog','Cat','Cat'], [1,1,2,2]]
简化数组方法实现
如果喜欢更简洁的写法,可以用数组的reduce和map方法:
var a = [['Dog','Cat'],[1,2]]; var b = a.reduce((res, arr) => { return [ res[0].concat(...arr.map(() => ['G', 'X'])), res[1].concat(...arr.map(item => [item, item])), res[2].concat(...arr.map(item => [item, item])) ]; }, [[], [], []]);
逻辑说明
- 先初始化
b为包含三个空数组的结构,对应目标数组的三个子数组 - 遍历原数组的列而非行,确保每一组关联元素(比如Dog和1)被同时处理
- 每处理一列,就往
b的三个子数组中各添加两次数据:一次对应前缀G,一次对应前缀X,同时重复原数组的元素,最终得到目标结构
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

