Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.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.filter()方法中向回调函数传递额外的参数?_Javascript_Callback_Scope - Fatal编程技术网

如何在Javascript.filter()方法中向回调函数传递额外的参数?

如何在Javascript.filter()方法中向回调函数传递额外的参数?,javascript,callback,scope,Javascript,Callback,Scope,我想将数组中的每个字符串与给定的字符串进行比较。我目前的做法是: function startsWith(element) { return element.indexOf(wordToCompare) === 0; } addressBook.filter(startsWith); 这个简单的函数可以工作,但这只是因为现在wordToCompare被设置为一个全局变量,但我当然希望避免这种情况,并将其作为参数传递。我的问题是,我不确定如何定义startsWith(),因此它接受一个额

我想将数组中的每个字符串与给定的字符串进行比较。我目前的做法是:

function startsWith(element) {
    return element.indexOf(wordToCompare) === 0;
}
addressBook.filter(startsWith);
这个简单的函数可以工作,但这只是因为现在wordToCompare被设置为一个全局变量,但我当然希望避免这种情况,并将其作为参数传递。我的问题是,我不确定如何定义startsWith(),因此它接受一个额外的参数,因为我不太理解它所接受的默认参数是如何传递的。我尝试了我能想到的所有不同的方法,但没有一种有效


如果您还可以解释传递给“内置”回调函数的参数(对不起,我不知道更好的术语)是如何工作的,那将是非常好的

使
开始使用
接受单词进行比较,并返回一个函数,然后将其用作过滤器/回调函数:

function startsWith(element, wordToCompare) {
    return element.indexOf(wordToCompare) === 0;
}

// ...
var word = "SOMETHING";

addressBook.filter(function(element){
    return startsWith(element, word);
});
function startsWith(wordToCompare) {
    return function(element) {
        return element.indexOf(wordToCompare) === 0;
    }
}

addressBook.filter(startsWith(wordToCompare));
function filter(array, callback) {
    var result = [];
    for(var i = 0, l = array.length; i < l; i++) {
        if(callback(array[i])) {  // here callback is called with the current element
            result.push(array[i]);
        }
    }
    return result;
}
另一个选项是使用(仅在支持ECMAScript 5的浏览器中可用,对于较旧的浏览器,请遵循垫片链接)并“修复”第一个参数:

function startsWith(wordToCompare, element) {
    return element.indexOf(wordToCompare) === 0;
}

addressBook.filter(startsWith.bind(this, wordToCompare));

我真的不明白它所采用的默认参数是如何传递的

这没什么特别的。在某个时刻,
filter
只调用回调并传递数组的当前元素。这是一个调用另一个函数的函数,在本例中是作为参数传递的回调函数

下面是一个类似函数的示例:

function startsWith(wordToCompare) {
    return function(element) {
        return element.indexOf(wordToCompare) === 0;
    }
}

addressBook.filter(startsWith(wordToCompare));
function filter(array, callback) {
    var result = [];
    for(var i = 0, l = array.length; i < l; i++) {
        if(callback(array[i])) {  // here callback is called with the current element
            result.push(array[i]);
        }
    }
    return result;
}
函数过滤器(数组、回调){
var结果=[];
for(var i=0,l=array.length;i
过滤器的第二个参数将在回调内部设置

arr.filter(callback[, thisArg])
所以你可以这样做:

function startsWith(element) {
    return element.indexOf(this) === 0;
}
addressBook.filter(startsWith, wordToCompare);

您可以在过滤器内使用箭头功能,如下所示:

result = addressBook.filter(element => element.indexOf(wordToCompare) === 0);

与函数表达式相比,箭头函数表达式的语法更短,并且在词汇上绑定this值(不绑定自己的this、arguments、super或new.target)。箭头函数总是匿名的。这些函数表达式最适合于非方法函数,它们不能用作构造函数

基于奥德瑞文的回答 及

我用了两种不同的方法。 1) 采用函数法。 2) 使用内联方式

//以下是示例代码:
变量模板列表=[
{name:“name1”,索引:1,维度:1},
{name:“name2”,索引:2,维度:1},
{名称:“name3”,索引:3,维度:2}];
//方法1)使用函数:
函数getDimension1(obj){
if(obj.dimension==1)//这是硬编码的。
返回true;
否则返回false;
} 
var tl=templateList.filter(getDimension1);//它将返回2个结果。第一和第二个对象。
控制台日志(tl);
//方法2)使用内联方式
var tl3=templateList.filter(element=>element.index==1 | | element.dimension==2);
//它将返回第一个和第三个对象

控制台日志(tl3)对于那些使用箭头函数寻找ES6替代方案的人,可以执行以下操作

let startsWith = wordToCompare => (element, index, array) => {
  return element.indexOf(wordToCompare) === 0;
}

// where word would be your argument
let result = addressBook.filter(startsWith("word"));
更新版本使用:


任何想知道为什么他们的胖箭头函数忽略了
[,thisArg]
,例如为什么

[“狗”、“猫”、“狗”].过滤器(动物=>动物===这只“狗”)
返回
[]

这是因为这些箭头函数中的
this
在创建函数时被绑定,并且在更广泛的范围内被设置为
this
的值,因此
thisArg
参数被忽略。通过在父作用域中声明一个新变量,我很容易地解决了这个问题:

let bestPet=“DOG”;
[“狗”、“猫”、“狗”]。过滤器(动物=>动物===最佳宠物);
=>[“狗”,“狗”]

以下是更多阅读的链接:

有一种简单的方法可以使用过滤功能,访问所有参数,并且不会使其过于复杂

除非回调的thisArg设置为另一个作用域,否则筛选器不会创建自己的作用域,并且我们可以访问当前作用域中的参数。我们可以设置“this”来定义不同的范围,以便在需要时访问其他值,但默认情况下,它被设置为调用它的范围。你可以看到这是用于角度范围

使用indexOf违背了筛选的目的,并增加了更多的开销。过滤器已经在遍历数组,那么为什么我们需要再次遍历它呢?我们可以让它变得简单

下面是React类方法中的一个用例场景,其中状态有一个名为items的数组,通过使用过滤器,我们可以检查现有状态:

checkList = (item) => {  // we can access this param and globals within filter
  var result = this.state.filter(value => value === item); // returns array of matching items

  result.length ? return `${item} exists` : this.setState({
    items: items.push(item) // bad practice, but to keep it light
  });
}

好吧,现在我明白了。我试图将参数直接传递给回调函数。。。我真的需要使用JavaScript。谢谢你,菲利克斯,你的回答很有帮助。传递额外的论点怎么样?我试着传递了一系列的参数,但这似乎是正确的fail@geotheory:他们呢?您可以像传递任何其他函数一样传递多个参数。函数名后面的bind(this)以及filter()链接帮助我使用。这个函数内部。谢谢。在第一个代码片段中,在
startsWith
函数中,
元素从哪里来?我发现这是最好的答案。所以现在新数组将被分配给wordToCompare对象,对吗?以后如何使用wordToCompare对象访问新数组?最佳答案。适用于过滤和查找。并且符合WC3文档:thisValue-可选。传递给函数作为其“this”值的值。如果此参数为空,则值“undefined”将作为其“this”传递value@TarekEldeeb只需传递一个你制作的对象
{1:'哈哈',2:'呵呵'}
这是一个很好的例子,说明了答案之间在复杂度和复杂度方面存在巨大差异