Javascript,遍历数组和参数 "object"

Javascript, looping through an array and the arguments "object"

我无法理解这个问题,我正在使用 filter 循环遍历数组并过滤掉所有作为参数传递的整数,我不受参数数量的限制。

但是当它要返回函数 arguments 对象的值时,我被困在这里,至少不止一次。

在我下面的代码中,显然它没有完全工作,因为我在 for…in 循环中做了一个 return,这是我不知道如何获得第二个的地方循环而不用 i 重新初始化为 0

function destroyer(arr) {
  var args = arguments.length;
  var arg0 = arguments[0];
  var Nargs = Array.prototype.slice.call(arguments, 1);
  var newArr = [];
  
  
    newArr = arg0.filter(filtre);
    
    /*Only the first argument is 
    filtered out,here it's the value "2",
    but should filter out [2,3].
    The expected result is [1,1]*/
    console.log(newArr);
    return newArr;    
  
     function filtre(e){
 
         for (var i in Nargs){

           return e !== Nargs[i];
         } 
     }
}


destroyer([1, 2, 3, 1, 2, 3], 2,3);

希望这已经够清楚了,

感谢任何输入!

数学

因为你的 filtre 函数中的 return 语句总是在第一个 运行 上执行,它只是 return 判断 Nargs 中的第一个数字是否等于当前项目.相反,您可以使用 indexOf 来获得完整的浏览器支持(returns 数组中项目的索引,如果不在数组中则为“-1”)而不是循环(或包含,或循环等,如下所示):

function destroyer(arr) {
  var args = arguments.length;
  var arg0 = arguments[0];
  var Nargs = Array.prototype.slice.call(arguments, 1);
  var newArr = [];
  
  function filtre(e){
    return Nargs.indexOf(e) === -1;
  }
  
  newArr = arg0.filter(filtre);
  console.log(newArr);
  return newArr;
}
destroyer([1, 2, 3, 1, 2, 3], 2,3);

如果您不需要 Internet Explorer 支持,您可以使用 Array.includes:

  function filtre(e){
    return !Nargs.includes(e);
  }

最后,如果您真的想要使用循环,您只想过滤一个项目(return false)一旦找到它否则允许它( return 真):

 function filtre(e){
   for (var i = 0, l = Nargs.length; i < l; i++) {
     if (e === Nargs[i])
       return false;
   } 
   return true;
 }

虽然 rgthree 提供了一个与您已有的解决方案非常相似的解决方案,但我想提供一个利用现代浏览器的更新 ES6 功能的解决方案。如果你通过 Babel 运行 这个,它会产生与那个解决方案基本相同的代码,尽管它仍然需要一个 shim 来进行 includes 调用。

function destroyer(source, ...args) {
    return source.filter(el => !args.includes(el));
}

解释:

...args 使用 spread operator 将除第一个参数之外的所有参数都放入名为 args 的数组中。

我们可以直接return过滤后的数组,假设您不需要记录它,那只是为了调试。

el => !args.includes(el) 是匿名 arrow function。由于没有使用大括号,它会自动 return 表达式的结果。

由于args是一个数组,我们可以直接使用Array.prototype.includes来判断当前元素是否在要移除的参数中。如果它存在,我们要将其删除,从而将 return 反转为 !。替代方案可能如下:el => args.includes(el) == false