提问人:vinnyWebDev 提问时间:1/13/2023 最后编辑:Ruan MendesvinnyWebDev 更新时间:1/13/2023 访问量:62
从数组中删除多个参数
Removing multiple arguments from an array
问:
我一直在尝试编写一个函数,该函数将数组作为第一个参数,然后是一个或多个其他参数,它们是数字。该函数的目的是检查数组中是否存在这些数字,如果存在,则将其删除。
我尝试了以下方法,但结果不是我预期的。 期望的结果是将 3 和 2 从数组中删除,留下 [1,4]。相反,只删除了 2 个,最终结果为 [1,3,4]。我已经为此苦苦挣扎了一段时间,并希望您能提供任何反馈。我知道这一点,这是迄今为止让我难倒的第一个问题!
function test(myArray, ...checkNums) {
for (let num in checkNums) {
for (let num2 in myArray) {
if (myArray[num] == checkNums[num2]) {
myArray.splice(num, 1);
}
}
}
return myArray;
}
const arr = test([1, 2, 3, 4], 3, 2);
console.log({arr})
答:
0赞
Samathingamajig
1/13/2023
#1
最简单的方法是过滤数组以仅保留不在 中的值。使用 a 可以提供更好的性能(根据实现的不同,与 Array 相比,Set 的查找是 OR 或任何子线性的)。checkNums
Set
O(1)
O(log n)
O(n)
function test(myArray, ...checkNums) {
const checkNumsSet = new Set(checkNums);
return myArray.filter((num) => !checkNumsSet.has(num));
}
const arr = test([1, 2, 3, 4], 3, 2);
console.log({arr})
评论
0赞
Ruan Mendes
1/13/2023
我不明白为什么您需要将其转换为集合,这可能是性能改进,但似乎为时过早的优化。
0赞
Ruan Mendes
1/13/2023
#2
您的代码正在删除项,因此在删除元素后,索引变量已过时。最简单的解决方法是向后迭代。
此外,应避免使用 for in
遍历数组
最后,您的数组只是修改了传入的内容,但您从未保留对它的引用,我将返回修改后的数组。
function test(myArray, ...checkNums) {
for (let checkNumsIndex = checkNums.length - 1; checkNumsIndex >=0; checkNumsIndex--) {
for (let myArrayIndex = myArray.length - 1; myArrayIndex >=0; myArrayIndex--) {
if (myArray[myArrayIndex] == checkNums[checkNumsIndex]) {
myArray.splice(myArrayIndex, 1);
}
}
}
return myArray;
}
const arr = test([1, 2, 3, 4], 3, 2);
console.log({arr});
更直接的做法是使用 filter 和 includes。这不会像您的示例那样在测试数组边界之外的值。
function removeElements(myArray, ...checkNums) {
return myArray.filter((num) => !checkNums.includes(num));
}
const arr = removeElements([1, 2, 3, 4], 3, 2);
console.log({arr});
0赞
Rhys Mills
1/13/2023
#3
使用 和 作为数组,您可以使用基于以下条件的过滤器:myArray
checkNums
.includes
const myArray = [1,2,3,4];
const checkNums = [3,4];
const filterNums = (nums, checkNums) => {
return nums.filter(num => !checkNums.includes(num));
}
console.log(filterNums(myArray, checkNums));
0赞
Mara Black
1/13/2023
#4
您可以使用 see for..在VS中...of 为了遍历你的参数,检查数组中是否存在该数字,如果存在,则在索引号处for...of
splice
function test(myArray, ...checkNums) {
//get the elements from ...checkNums
for (let num of checkNums) {
//check if your number exist in array
if (myArray.includes(num)) {
const indexOfNum = myArray.indexOf(num);
//if it exists splice at found index of your umber
myArray.splice(indexOfNum, 1)
}
}
return myArray;
}
const result = test([1, 2, 3, 4], 3, 2);
console.log(result)
评论
myArray[num2] == checkNums[num]