请原谅我,如果有人问我,但是我搜查了一下,但没有找到问题的具体实施。
无论如何,我目前正在学习JavaScript中的高阶函数,而我正在使用array.prototype.filter函数。我理解它的目的(正如它的名字所说的那样方便),但我在实现这个方面遇到了麻烦:
所以,我说有一系列名字,如下:
var names = ["Anna", "Bob", "Charles", "Daniel",
"Allison", "Beatrice", "Cindy", "Fiona"];
然后,我希望按照以字母“A”开头的所有条目过滤该数组。我知道我能做到这一点:
var filteredNames = names.filter(function(word) {
return word[0] === "A";
});
这样就可以了。但是说我希望不那么明确,让它更适应更多情况。假设我想对过滤进行编程,以便我可以说“仅返回索引[y]”处具有字母“x”的条目,例如“仅返回索引为[3]处具有字母”F“的条目
我怎样才能做到这一点?
答案 0 :(得分:6)
您可以定义自己的过滤功能:
function filter(names, index, letter) {
var filteredNames = names.filter(function(word) {
return word.charAt(index) === letter;
});
return filteredNames;
}
答案 1 :(得分:3)
我认为正则表达式会更灵活
var filteredNames = names.filter(function(word) {
return /^A/.test(word);
});
使用它的一般方法
function filterMatches(words, regexp) {
return words.filter(function (word) {
return regexp.test(word);
});
}
filterMatches(words, /^A/); // for letter A, index 0
filterMatches(words, /^.{3}B/); // for letter B, index 4
答案 2 :(得分:1)
为什么不创建一个功能来做你想要的?从您的代码中可以看出:
function filterName(arrayOfNames, index, letter) {
var filteredNames = arrayOfNames.filter(function(word) {
return word[index] === letter;
});
return filteredNames
}
所以你可以将数组,索引和字母传递给它:
console.log(filterName(arrayOfNames, 3, 'x'));
答案 3 :(得分:0)
您的过滤器功能可能非常复杂,as long as它会为要保留的值返回true
,并为要跳过的值返回false
。例如:
var filteredNames = names.filter(function(word) {
return word.length > 3 && word[3] === "Y";
});
更好的是,您可以动态创建回调函数,因为函数在JS中是first-class citizens:
function createCallback(position, letter) {
return function (word) {
return word.length > position && word[position] === letter;
}
}
var filteredNames = names.filter(createCallback(3, "Y"));
像filter
和map
这样的高阶函数将其他函数作为值来帮助他们完成工作。你现在可以通过构建一个函数数组来实现更深层次的重定向,并使用高阶函数reduce将它们全部应用:
function createCallback(position, letter) {
return function (word) {
return word.length > position && word[position] === letter;
}
}
function applyFilter(currentFilter, currentNames) {
return currentNames.filter(currentFilter);
}
var filters = [
createCallback(3, "Y"),
createCallback(0, "A"),
createCallback(2, "Y")
];
var ultraFilteredNames = filters.reduce(applyFilter, names);
答案 4 :(得分:0)
您可以创建自己的自定义功能
var array =["Anna", "Bob", "Charles", "Daniel", "Allison", "Beatrice", "Cindy", "Fiona"];
var matched_terms = [];
var search_term = "an";
search_term = search_term.toLowerCase();
array.forEach(item => {
if(item.toLowerCase().indexOf(search_term) !== -1 ){
console.log(item);
matched_terms.push( item );
}
console.log(matched_terms);
})