如何基于指定元素复制二维数组子数组并自定义前3位元素
需求:根据子数组指定元素复制并自定义子数组内容
原始数组
let arr = [ ["Rhonda", "Great Britain", 1, "Coffee", "Roasted"], ["Greg", "United States", 2, "Sugar", "Brown"], ["Bob", "Australia", 1, "Bread", "White"], ];
期望结果
根据每个子数组第3个元素(索引为2)的数值,复制对应次数的子数组,同时自定义复制后子数组的前3位元素,最终得到:
let result = [ ["Rhonda", "Great Britain", 1, "Coffee", "Roasted"], [" ", " ", " ", "Coffee", "Roasted"], ["Greg", "United States", 2, "Sugar", "Brown"], [" ", " ", " ", "Sugar", "Brown"], [" ", " ", " ", "Sugar", "Brown"], ["Bob", "Australia", 1, "Bread", "White"], [" ", " ", 1, "Bread", "White"], ];
当前错误实现及结果
当前使用splice的逻辑有误,代码如下:
for (var i = arr.length - 1; i >= 0; i--) { let multiplier = arr[i][2]; arr.splice(multiplier, 0, [arr[i][0], arr[i][1]]); }
得到的错误结果:
[[Bob, Australia], [Bob, Australia], [Rhonda, Great Britain, 1.0, Coffee, Roasted], [Bob, Australia], [Greg, United States, 2.0, Sugar, Brown], [Bob, Australia, 1.0, Bread, White]]
正确实现方法
核心思路是创建新数组存储结果,避免直接修改原数组导致的索引混乱。对每个子数组,先加入原元素,再根据数值生成对应数量的自定义复制项:
let arr = [ ["Rhonda", "Great Britain", 1, "Coffee", "Roasted"], ["Greg", "United States", 2, "Sugar", "Brown"], ["Bob", "Australia", 1, "Bread", "White"], ]; const result = []; arr.forEach(item => { // 先加入原数组项 result.push([...item]); const multiplier = item[2]; // 生成对应次数的复制项 for (let i = 0; i < multiplier; i++) { // 自定义前三位:根据示例区分Bob的特殊情况,可按需调整规则 const customPrefix = item[0] === "Bob" ? [" ", " ", 1] : [" ", " ", " "]; // 拼接前缀与原数组的后两位 const copyItem = [...customPrefix, item[3], item[4]]; result.push(copyItem); } }); console.log(result);
代码说明
- 遍历原数组,先将原子数组浅拷贝后加入结果数组。
- 获取当前子数组的复制次数(索引2的数值),循环对应次数生成复制项。
- 根据需求自定义复制项的前三位内容,示例中通过判断原项第一个元素区分Bob的特殊规则,也可改为更通用的自定义逻辑(比如传入函数生成前缀)。
- 将自定义前缀与原数组后两位拼接成新子数组,加入结果数组。
这种方式不修改原数组,逻辑清晰,避免了splice操作导致的索引偏移问题。
内容的提问来源于stack exchange,提问作者Borgher
相关产品推荐
相关产品推荐

