使用函数从数组中删除项目

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 &lt; [[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);

【讨论】:

以上是关于使用函数从数组中删除项目的主要内容,如果未能解决你的问题,请参考以下文章

使用 findIndex() 从数组中删除特定元素 - React [重复]

如何从由类中的函数组成的数组中删除项目?

从Vue中的数组中删除项目

使用拼接反应本机从数组中删除对象元素

从数组javascript中删除项目时重新呈现列表的问题

交换数组两个数位置方法