我正在从事Odin项目,并且正在从事基础部分4“ removeFromArray”的分配。我必须返回一个数组,其中删除了参数列表中的所有元素。它可以使用两个参数,但是我不能使用四个参数。我的代码如下:
const removeFromArray = function(firstArray, ...toRemove) {
let modifiedArray = firstArray;
for (i = 0; i < firstArray.length; i++) {
if (modifiedArray.includes(toRemove[i])) {
modifiedArray.splice(modifiedArray.indexOf(toRemove[i]), 1)
}
}
return modifiedArray;
}
removeFromArray([1, 2, 3, 4], 7, 2) // works, returns [1, 3, 4]
removeFromArray([1, 2, 3, 4], 3, 2) // also works, returns [1, 4]
removeFromArray([1, 2, 3, 4], 1, 2, 3, 4) //does not work, returns [3, 4]
任何帮助深表感谢。
最佳答案
我认为真正的问题是,您可能不知道JavaScript中的数组,对象和函数是通过引用传递的。
let modifiedArray = firstArray;
意味着您的firstArray和ModifyedArray都指向内存中的同一数组。上面的代码为EXACT分配了相同的数组,从技术上讲,将firstArray内存中的地址分配给了ModifyedArray。因此,当您从ModifyedArray中删除项目时,您也要从firstArray中删除它们,从而更改firstArray的长度。
您需要按值而不是按引用复制数组。
解:
因此改变
let modifiedArray = firstArray;
至
let modifiedArray = [...firstArray];
要么
let modifiedArray = firstArray.slice();
第一种解决方案利用第一个数组的解构,通过值创建数组的副本,而不是指向内存中的同一数组。
作为初学者,第二个可能对您来说比较熟悉,因为这只会返回数组的副本,而不会删除任何元素。
如果您对按值复制数组还有其他疑问,请参见此线程:Copy array by value
const removeFromArray = function(firstArray, ...toRemove) {
let modifiedArray = [...firstArray];
for (i = 0; i < firstArray.length; i++) {
if (modifiedArray.includes(toRemove[i])) {
modifiedArray.splice(modifiedArray.indexOf(toRemove[i]), 1)
}
}
return modifiedArray;
}
console.log(removeFromArray([1, 2, 3, 4], 7, 2)); // works, returns [1, 3, 4]
console.log(removeFromArray([1, 2, 3, 4], 3, 2)); // also works, returns [1, 4]
console.log(removeFromArray([1, 2, 3, 4], 1, 2, 3, 4)); //does not work, returns [3, 4]