使用Array.filter()方法输出奇怪的输出

时间:2017-07-04 09:59:59

标签: javascript

在下面的代码中,我预计destroyer([1, 2, 3, 1, 2, 3], 2, 3);的结果为[1,1]

但结果会弹出[1,2,3,1,2,3]

我哪里错了?

function destroyer(arr) {
  function hlp(x) {
    for(var i=1; i<arguments.length ; i++) {
      if(x == arguments[i]) return false;
    }
    return true;
  }
  return arr.filter(hlp);
}
console.log(destroyer([1, 2, 3, 1, 2, 3], 2, 3));

3 个答案:

答案 0 :(得分:0)

你已经定义destroyer只接受一个参数,而你传递的不止一个。 arguments未定义,并且在传递给Array.filter()的函数中迭代不是一个好主意。 Array.filter()为您检查每个元素。并不是说它可以在您的代码中使用,但如果可以的话,最好只返回x == arguments[i]而不是检查它是true还是false。如果你返回x == arguments[i],你实际上是返回一个布尔值。这方面的一个例子是我在return exclude.indexOf(i) == -1;下面的代码中的位置。请尝试以下方法:

function destroyer(arr, exclude) {
  return arr.filter(function(i) {
    return exclude.indexOf(i) == -1;
  });
}
console.log(destroyer([1, 2, 3, 1, 2, 3], [2, 3]));

答案 1 :(得分:0)

您可以使用ES6 rest parameter syntax并使用include()检查数组是否包含任何参数

&#13;
&#13;
function destroyer(arr, ...rest) {
  function hlp(e) {
    return !rest.includes(e)
  }
  return arr.filter(hlp);
}
console.log(destroyer([1, 2, 3, 1, 2, 3], 2, 3));
&#13;
&#13;
&#13;

如果您想使用for循环和arguments,您的代码应如下所示。

&#13;
&#13;
function destroyer(arr) {
  var arg = arguments

  function hlp(x) {
    for (var i = 1; i < arg.length; i++) {
      if (x == arg[i]) return false;
    }
    return true;
  }
  return arg[0].filter(hlp);
}
console.log(destroyer([1, 2, 3, 1, 2, 3], 2, 3));
&#13;
&#13;
&#13;

答案 2 :(得分:0)

解决方法有两种:

第一

function destroyer(arr) {
  function hlp(x) {
    for(var i=1; i<destroyer.arguments.length ; i++) {
      if(x == destroyer.arguments[i]) return false;
    }
    return true;
  }
  return arr.filter(hlp);
}
console.log(destroyer([1, 2, 3, 1, 2, 3], 2, 3));

第二

查看@Nenad Vracar发布的解决方案