7

I'm trying to check efficiently if a string matches any of an array of regexes and return true in the first encountered match (Breaking the iteration over the regexes)

My current code:

_.forEach(self._connectedClients, function(client) {
        if (client.authenticated) {
            var interested = _.forEach(client.interests, function(interest) {
                if (evt.event_type.search(interest) != -1) {
                    return true;
                }
            });
            if (interested) {
                self._sendJSON(client.socket, data);
            }
        }
    });

Interest is an array of regexes.

Any suggestions?

Thanks in advance

4
  • so, you want to have var regexes = [/a/,/b/,/c/] and var string = "teststring" and see which regexes match true? Commented Nov 10, 2015 at 18:12
  • Wait, is client.interests or interest an array of regexes? Commented Nov 10, 2015 at 18:18
  • @Kristian I don't really care which one matches I just wanna know if any of them matches. FelixKling The client.interests is the array of regexes. Commented Nov 10, 2015 at 18:20
  • Cool, then I'll stick with my answer submission. Commented Nov 10, 2015 at 18:32

3 Answers 3

4

You could use _.some, when the function passed returns a truthy value iteration will stop and true will be returned. If it can't find a truthy value it will return false, after iterating through the entire array.

Example:

_.forEach(self._connectedClients, function(client) {
    if (client.authenticated) {
        if (_.some(client.interests, _.method('test', evt.event_type))) {
            self._sendJSON(client.socket, data);
        }
    }
});
Sign up to request clarification or add additional context in comments.

1 Comment

.test is a method on a regular expression, not on a string.
3

Just use Array#some:

some() executes the callback function once for each element present in the array until it finds one where callback returns a true value. If such an element is found, some() immediately returns true.

var interested = client.interests.some(function(regex) {
  return regex.test(evt.event_type);
});

Of course you can also use lodash's _.some implementation.

Comments

0

If I'm understanding you correctly, using plain javascript, you could do the following to check for matches of a single string over multiple regular expressions.

for(var i = 0; i<x.length; i++) {
  var regex = x[i]; console.log('regex', regex);
  if( str.match( x[i] ) ) {
    console.log("regex:",x[i]," matching: true");
  } else {
    console.log("regex:",x[i]," matching: false");
  }
}

However, if you meant something else, then do clarify. :)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.