Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Filter array by letter

Pardon me if this has been asked but I searched and didn't find the specific implementation of my problem.

Anyway, I'm currently learning high-order functions in JavaScript and I'm at the array.prototype.filter function. I understand its purpose (as its name so conveniently implies) but I'm having trouble implementing this:

So, say I have an array of names, like this:

var names = ["Anna", "Bob", "Charles", "Daniel",
         "Allison", "Beatrice", "Cindy", "Fiona"];

And then I want to, say, filter that array by all entries that start with the letter "A". I'm aware of the fact that I could do this:

var filteredNames = names.filter(function(word) {
    return word[0] === "A";
});

And that would work just fine. But say I want to be less explicit and make it more adaptable to more situations. Say I want to program the filtering so that I can say "return only the entries that have the letter "x" at index [y]", for example "return only the entries that have the letter "F" at index[3].

How can I achieve that?

like image 772
MateBoy Avatar asked Sep 28 '15 09:09

MateBoy


4 Answers

You can define your own filter function :

function filter(names, index, letter) {
    var filteredNames = names.filter(function(word) {
       return word.charAt(index) === letter;
    });
    return filteredNames;
}
like image 143
PMerlet Avatar answered Sep 22 '22 16:09

PMerlet


A regexp will be more flexible I guess

var filteredNames = names.filter(function(word) {
    return /^A/.test(word);
});

A generic way to use it

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
like image 29
axelduch Avatar answered Sep 23 '22 16:09

axelduch


why not create a function to do just what you want? From your code it be like this:

function filterName(arrayOfNames, index, letter) {
    var filteredNames = arrayOfNames.filter(function(word) {
     return word[index] === letter;
    });
    return filteredNames 
}

So you can just pass on the array, index and letter to it:

console.log(filterName(arrayOfNames, 3, 'x'));
like image 21
Cedric Avatar answered Sep 19 '22 16:09

Cedric


You can create your own custom function

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);
})
like image 35
TheVigilant Avatar answered Sep 23 '22 16:09

TheVigilant