Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 向筛选器()传递参数_Javascript - Fatal编程技术网

Javascript 向筛选器()传递参数

Javascript 向筛选器()传递参数,javascript,Javascript,我有一个函数,它接受一个数组,然后接受多个参数。在该函数中,我想对数组使用filter()方法,但我想使用参数[I]。例如: function destroyer(arr) { var test = arr.filter(function(value){ return value != arguments[1]; }); return test; } console.log(destroyer([1, 2, 3, 1, 2, 3], 2, 3)); 在那里调用参数[1]并

我有一个函数,它接受一个数组,然后接受多个参数。在该函数中,我想对数组使用filter()方法,但我想使用参数[I]。例如:

function destroyer(arr) {
  var test = arr.filter(function(value){
    return value != arguments[1];
  });
  return test;
}

console.log(destroyer([1, 2, 3, 1, 2, 3], 2, 3));
在那里调用参数[1]并不能满足我的要求,因为我猜匿名函数有自己的参数,filter()正在使用这些参数。我想到的一个解决方案是创建一个数组并将参数复制到该数组中。但我想知道是否有办法将参数传递给过滤器?我知道过滤器有一个thisArg值,但我不知道如何使用它来获得我想要的


编辑:我曾尝试在谷歌上搜索解决方案,大多数解决方案都涉及使用bind或apply。但是,我找不到与filter()或类似方法(如forEach、reduce、map等)直接相关的任何内容。我尝试使用“this”作为thisArg值,但这似乎没有任何作用。我尝试使用bind和apply,但似乎无法获得正确的语法。

如果您可以访问ES6环境,可以使用“扩展参数”(
)来表示可变长度参数列表。除了箭头函数和
Array#includes
,您的代码可能非常紧凑:

function destroyer(arr, ...destroy) {
  return arr.filter(value => !destroy.includes(value));
}
我有一个可行的解决方案(将参数复制到数组中),但我更感兴趣的是尝试找出如何将参数传递给filter(),以便更好地理解filter()和其他类似方法的工作方式

您不需要将参数传递给
filter()
。参数可以简单地在过滤器回调的范围内提供。然而,
参数
是特殊的;它指的是当前函数的参数。无法引用其他函数的参数,例如外部函数。因此,除了在外部函数中保存不同变量名下的参数(如
args
),别无选择;然后可以从回调中引用该变量,因为回调“关闭”该变量

如果您真的想将要销毁的数字列表“传递”给内部函数,而不是让它通过引用外部范围中创建的变量来访问它们,那么是的,理论上您可以使用
thisArg

function destroyer(arr/*, number to destroy*/) {
  return arr.filter(do_not_destroy, arguments);
                                    ^^^^^^^^^ PASS thisArg
}
现在我们可以将
不销毁
定义为

function do_not_destroy(elt) {
  return [].slice.call(this, 1).indexOf(elt) === -1;
                       ^^^^ REFER TO thisArg (arguments)
}
function do_not_destroy(elt) {
  return this.indexOf(elt) === -1;
}
注意这里的两件事。首先,我们将参数列表称为
this
,因为我们使用
thisArg
将它们传递给
filter
。其次,我们不能编写
this.slice…
,而必须编写
[].slice.call(this…
),因为
this
是一个arguments对象,它不是一个“实”数组,也没有
slice
方法

要使
do\u not\u destroy
独立于它的参数是一个特殊参数对象这一事实,在开始时有一个额外的参数(数组),我们可以在
destropher
函数中进行到数组的转换:

function destroyer(arr/*, number to destroy*/) {
  return arr.filter(do_not_destroy, [].slice.call(arguments, 1));
}
现在我们可以将
不销毁
定义为

function do_not_destroy(elt) {
  return [].slice.call(this, 1).indexOf(elt) === -1;
                       ^^^^ REFER TO thisArg (arguments)
}
function do_not_destroy(elt) {
  return this.indexOf(elt) === -1;
}

但是现在我们基本上回到了我们开始的地方,不再仅仅通过让内部函数(回调)来“传递”要忽略的值列表引用外部作用域中的变量集,我们使用后门
thisArg
机制将它们传递给回调。我真的看不出这一点。

那么期望的输出是什么在这个示例中,期望的输出将是一个数组,包含除2之外的所有元素。但我想让它与任何I>1一起工作。不是所有的除了2和3之外还有e元素?我想让这个具体的例子只使用2,然后我想对它进行推广。我正在经历免费代码阵营,它看起来不支持ES6。我有一个可行的解决方案(将参数复制到数组中),但我更感兴趣的是如何将参数传递给filter(),以便更好地理解filter()和其他类似方法的工作原理。谢谢,这提供了很多信息!我更感兴趣的是它背后的理论,以便更好地理解它的工作原理。