Javascript 向筛选器()传递参数
我有一个函数,它接受一个数组,然后接受多个参数。在该函数中,我想对数组使用filter()方法,但我想使用参数[I]。例如: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]并
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()和其他类似方法的工作原理。谢谢,这提供了很多信息!我更感兴趣的是它背后的理论,以便更好地理解它的工作原理。