按字母过滤数组

时间:2015-09-28 09:16:20

标签: javascript arrays filtering

请原谅我,如果有人问我,但是我搜查了一下,但没有找到问题的具体实施。

无论如何,我目前正在学习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“的条目

我怎样才能做到这一点?

5 个答案:

答案 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"));

filtermap这样的高阶函数将其他函数作为值来帮助他们完成工作。你现在可以通过构建一个函数数组来实现更深层次的重定向,并使用高阶函数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);
})