我正在从事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]

09-25 14:56