Adam Reed
Adam Reed

Reputation: 59

Implementing wildcard at end of a string

I looked through a number of posts (and other websites) and I seem to have a hit a roadblock. I have the following array:

var data_dictionary = ["youtube.com", "facebook.com", "youtube.com/feed/subscriptions", "twitter.com"]

I'm trying to return data for everything that has youtube.com*. Below is the relevant snippet of my function:

var result = []     
for (var i=0; i<data_dictionary.length; i++) {
   if (data_dictionary[i].page == /^youtube.com/) {
     result.push (data_dictionary[i].page,data_dictionary[i].share)
    }
 }
 break;       
}
return result

The problematic area is in the if clause (/^youtube.com/). How can I receive the following return:

["youtube.com" , "youtube.com/feed/subscriptions"]

Upvotes: 1

Views: 165

Answers (3)

Pranav C Balan
Pranav C Balan

Reputation: 115242

You can use Array.prototype.filter() method to filter array and RegExp.prototype.test() to check for match.

var data_dictionary = ["youtube.com", "facebook.com", "youtube.com/feed/subscriptions", "twitter.com"];

function check(data_dictionary) {
  return data_dictionary.filter(function(v) {
    return /^youtube\.com/.test(v);
    // using indexOf
    // v.indexOf('youtube.com') == 0;
  });
}
console.log(check(data_dictionary));


FYI: Your if condition will be only true if the string is '/^youtube.com/'. ie, ('/^youtube.com/' == /^youtube.com/) === true. Your code will work if you changed the if condition to /^youtube.com/.test(data_dictionary[i]). Also in the provided data page and share properties are undefined only plain strings are the element.

Upvotes: 3

Redu
Redu

Reputation: 26191

No need for regex here you can do like this;

var data_dictionary = ["youtube.com", "facebook.com", "youtube.com/feed/subscriptions", "twitter.com"],
filtered = data_dictionary.filter(e => !!~e.indexOf("youtube.com") && e);
document.write("<pre>" + JSON.stringify(filtered) + "</pre>");

Or if you want a faster solution still with Array methods then

var data_dictionary = ["youtube.com", "facebook.com", "youtube.com/feed/subscriptions", "twitter.com"],
filtered = data_dictionary.reduce((p,c) => !!~c.indexOf("youtube.com") ? p.concat(c):p,[]);
document.write("<pre>" + JSON.stringify(filtered) + "</pre>");

Upvotes: 0

Akinjide
Akinjide

Reputation: 2763

Using the same approach that you had before. However using ".filter" won't be a bad idea, but I will suggest you compare their benchmark

var data_dictionary = ["youtube.com", "facebook.com", "youtube.com/feed/subscriptions", "twitter.com"];
var pattern = /^youtube.com/;
var result = [];
var i = 0;

function loop (args) {
  for (i; i < args.length; i++) {
    if (pattern.test(args[i])) {
        result.push(args[i]);
    }
  }
 return result;
}

console.log(loop(data_dictionary)) // ["youtube.com" , "youtube.com/feed/subscriptions"]

Comparing the speed below I would suggest you use the approach above

enter image description here

Upvotes: 0

Related Questions