使用函数从数组中删除项目
Posted
技术标签:
【中文标题】使用函数从数组中删除项目【英文标题】:Remove item from an array using a function 【发布时间】:2022-01-13 19:01:26 【问题描述】:我正在尝试构建一个从数组中删除项目的函数。数组和项都是在我调用函数时使用推入的参数配置的。
但是它没有返回预期的 [1,2,4] 而是返回“尚未”我在 if 语句中构建的字符串以在失败时返回。
我可以在控制台日志中看到弹出变量 = 3,并且当前的 for 循环正确地循环了所有选项。那么为什么它不起作用呢?
const removeFromArray = function()
let args = Array.from(arguments);
let popped = args.pop();
for (i = 0; i < args.length; i++)
let current = args[i];
if (current === popped)
console.log(args);
return args;
else
console.log("not yet");
;
removeFromArray([1, 2, 3, 4], 3);
【问题讨论】:
如果你正确缩进你的代码,你会帮自己一个忙。 为什么不直接使用 indexOf/splice? 为什么不直接在函数头声明参数呢?请注意,您作为第一个参数传递的数组位于arguments[0]
中。你不看那里。您似乎认为arguments
有很多条目,包括您传递的数组的条目,但它只有两个条目:(嵌套)数组和值。
在您的示例中,args.length 将为 1,因为一旦您弹出 3,就只剩下一个参数(数组)。我认为您的意思是迭代 args[0],而不是 args .
因为你的 for 循环正在遍历参数中的第一个参数,这是一个数组 for (i = 0; i < [[1,2,3,4]].length; i++)
所以比较是 if ([1,2,3,4] ===3)
【参考方案1】:
好的,我已经评论了您的代码,其中的问题并进行了相应的更改,以便它像您希望的那样工作:
const removeFromArray = function()
// arguments is not [1, 2, 3, 4, 3], but instead it's [[1, 2, 3, 4], 3] (length is 2, remember this later)
let args = Array.from(arguments);
// pop works correctly and returns 3
let popped = args.pop();
// here we cannot loop with args.length, as it is 2
// if we change args.length to args[0].length, this will work
for (i = 0; i < args[0].length; i++)
// args[i] won't work here for the same reason args.length didn't work,
// because we're targeting a wrong thing
// if we change this to args[0][i], it will work
let current = args[0][i];
// After the changes, this if will work correctly
if (current === popped)
// We can't just return args
// A) we're once again targeting and wrong thing
// B) we haven't removed anything yet
// so lets change this to first splice the array (remove the wanted value)
args[0].splice(i, 1);
// and then return the array where the wanted value is removed
return args[0];
;
const newArray = removeFromArray([1, 2, 3, 4], 3);
// output the returned new array where 3 is removed
console.log(newArray)
主要问题是args
不包含您认为的内容(数字数组),实际上是args[0]
。
另一件事是,当您找到要从数组中删除的值时,您实际上并没有删除它。所以这里我们使用 splice 在返回之前实际移除值。
【讨论】:
非常感谢,非常感谢所有的 cmets。这是有道理的,就像你说的主要问题是参数长度是 2 而不是 5,因此其余代码不起作用。 没问题!请注意,确实有更好的方法来实现这样的事情,就像其他人所展示的那样,但以自己的方式尝试事情永远不会有坏处。我想展示你如何使这个特定的实现以正确的方式工作:)【参考方案2】: const removeFromArray = function (array, itemToRemove)
return array.filter(item => item !== itemToRemove);
;
【讨论】:
谢谢,您介意向我解释一下吗?箭头函数对我来说是新的。似乎正在返回另一个函数,它说如果项目(这是在哪里声明的?)与第二个参数不同,然后过滤它? 当然!箭头功能很简单。 const func = (item) => item != 3 与 function func (item) return item != true ; 数组的方法 'filter' 为每个项目调用一个函数。如果函数返回 true,则此元素保留在数组中。我们也可以这样写 array.filter(function (item) return item != 3; );【参考方案3】:我不知道你为什么不使用像JS这样的任何内置函数
let removeFromArray = (arr, remove) => arr.filter(x => x != remove)
let filteredArray = removeFromArray([1, 2, 3, 4], 3)
但让我们按照你的方式去做
const removeFromArray(arr, remove)
const items = [];
for (const item of arr)
if (item != remove) items.push(item)
return items;
;
removeFromArray([1, 2, 3, 4], 3);
【讨论】:
谢谢。我正在学习 php,然后休息一下......【参考方案4】:我就是这样做的,因为你说你想修改原始数组而不是创建一个新数组,splice
将是正确的工具。
function removeFromArray(arr, rem)
while(~arr.indexOf(rem))
arr.splice(arr.indexOf(rem), 1);
var arr = [1, 2, 3, 4, 3];
removeFromArray(arr, 3)
console.log(arr);
【讨论】:
以上是关于使用函数从数组中删除项目的主要内容,如果未能解决你的问题,请参考以下文章