splice在forEach循环内的指定索引处不覆盖数组中的元素



我正在尝试将数组转换为稍微不同的格式,目前正在使用拼接,如下所示:

letnewArray.splice( idx , 0 , obj );

我的整个代码可以在下面看到:

let yaml_doc_json = [{
name: 'guidIds',
ids: ['209A3935-2305-4786-960B-BB008F3E9DC9',
'C10D76D2-89A3-4F28-B64E-2D78C953B283',
'B7164432-94B3-4096-A9EA-181D0F00D25E',
'DA366048-557F-42ED-AB1D-3B2196278E86'
]
},
{
name: 'keyMessage',
ids: ['Enbril_RA_30.00',
'Enbril_RA_40.00',
'Enbril_RA_50.00',
'Enbril_RA_10.00'
]
},
{
name: 'SequenceName',
ids: ['1_KEY_LUN_09_2017_Ukr_main',
'1_KEY_LUN_09_2017_Ukr_sl01',
'1_KEY_LUN_09_2017_Ukr_sl02',
'1_KEY_LUN_09_2017_Ukr_sl03'
]
}
],
letnewArray = [];
yaml_doc_json.forEach((e, i) => {
//console.log(e);
let id_name = yaml_doc_json[i].name;
//console.log(id_name);
e['ids'].forEach((elem, idx) => {
console.log(idx);
let obj = {
id_name: elem
}
letnewArray.splice(idx, 0, obj);
});
});
console.log(letnewArray);

为什么我在letnewArray中得到12个元素,即使idx总是在0-3之间?每次forEach循环运行时,是否应该覆盖特定索引处的元素?为什么现在发生了压倒一切的事情?我到底做错了什么?

letnewArray中的12个元素来自于yaml_doc_json中的三个元素中的每一个都经过四次阐述(ids元素的数量(。

之所以有12,是因为Array.prototype.splice的语法。完整的参考资料可以在这里找到:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice

重要的部分是语法: array.splice(start[, deleteCount[, item1[, item2[, ...]]]])

让我们回到您的代码。我们有 letnewArray.splice( idx , 0 , obj ); 根据上面的定义,我们可以推断

  • array => letnewArray
  • start => idx
  • deleteCount => 0
  • item1 => obj

将各种item1, item2, ...元素添加到阵列中。因此,每次for循环通过时,我们都会删除0个项目并添加1个元素。

这说明了为什么letnewArray变量中的结束元素是12。

我希望自己有用。

Splice将向现有数组添加第三个参数。参考https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_splice1

@charlietfl在评论中回答了这个问题!。

splice((的第二个参数是deleteCount。如果它是零,那么您所要做的就是在该索引中插入新项目和所有其他项目,然后超越将向右移动。

最新更新