如何将一个额外的parameter passing给Javascript .filter()方法中的callback函数?

我想比较一个数组中的每个string与给定的string。 我目前的实施是:

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

这个简单的函数工作,但只是因为现在wordToCompare被设置为一个全局variables,但我当然想要避免这一点,并将其作为parameter passing。 我的问题是,我不知道如何定义startsWith()所以它接受一个额外的参数,因为我真的不明白如何传递默认参数。 我试过了所有我能想到的不同方式,而且都没有工作。

如果你还可以解释如何传递参数到“内置”callback函数(对不起,我不知道这些更好的术语)工作,这将是伟大的

使开始接受单词比较,并返回一个函数 ,然后将被用作filter/callback函数:

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

另一个select是使用Function.prototype.bind [MDN] (仅在支持ECMAScript 5的浏览器中可用,按照旧版浏览器的Shim链接)并“修复”第一个参数:

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

我真的不明白如何传递默认参数

没有什么特别的。 在某个时候, filter只是调用callback函数并传递数组的当前元素。 所以这是一个调用另一个函数的函数,在这种情况下,您将传递的callback作为参数。

这是一个类似function的例子:

 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; } 

filter的第二个参数将在callback中设置。

 arr.filter(callback[, thisArg]) 

所以你可以做这样的事情:

 function startsWith(element) { return element.indexOf(this) === 0; } addressBook.filter(startsWith, wordToCompare); 
 function startsWith(element, wordToCompare) { return element.indexOf(wordToCompare) === 0; } // ... var word = "SOMETHING"; addressBook.filter(function(element){ return startsWith(element, word); }); 

您可以使用filter中的箭头function,如下所示:

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

Arrowfunction在MDN上

与函数expression式相比,箭头函数expression式具有更短的语法,并从词法上绑定此值(不绑定自己的this,arguments,super或new.target)。 箭头function始终是匿名的。 这些函数expression式最适合非方法函数,不能用作构造函数。

对于那些正在寻找使用箭头function的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] ,例如为什么

["DOG", "CAT", "DOG"].filter(animal => animal === this, "DOG")

这是因为这些箭头函数在创build函数时被绑定,并且在更广泛的范围内被设置为这个值,所以thisArg参数被忽略。 通过在父范围中声明一个新的variables,我可以轻而易举地解决这个问题:

let bestPet = "DOG"; ["DOG", "CAT", "DOG"].filter(animal => animal === bestPet); => ["DOG", "DOG"]

这是一个更多的阅读链接: https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions#No_separate_this

基于oddRaven的答案和https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

我做了2种不同的方式。 1)使用function方式。 2)使用内联的方式。

 //Here is sample codes : var templateList = [ { name: "name1", index: 1, dimension: 1 } , { name: "name2", index: 2, dimension: 1 } , { name: "name3", index: 3, dimension: 2 } ]; //Method 1) using function : function getDimension1(obj) { if (obj.dimension === 1) // This is hardcoded . return true; else return false; } var tl = templateList.filter(getDimension1); // it will return 2 results. 1st and 2nd objects. console.log(tl) ; //Method 2) using inline way var tl3 = templateList.filter(element => element.index === 1 || element.dimension === 2 ); // it will return 1st and 3rd objects console.log(tl3) ;