Detect whether a string has a letter 'b' 3 characters after 'a' I'm relatively new to JavaScript and wonder whether my code is 'acceptable' for a practice exercise. Essentially, the function (successfully) returns true or false if the provided string has a letter 'b' 3 characters after a letter 'a' - e.g.:

Input:"after badly" - Output:"false"
Input:"Laura sobs" - Output:"true"

Could somebody advise me how it could be improved? Although it works, I wonder whether the best functions are used and whether its 'readability' could be improved (i.e. return trueOrFalse.some(answer) ).



function bThreeAfterA(a) {
 var b = (a.split(' ').join('')).split('a'); // creates array

 var trueOrFalse = b.map(function(c, i){ // puts into array true/false for each index
  if (c[2] == 'b') {
   console.log('value: ' + c[2] + ' is b; true');
   return true;
  } else {
   console.log('false');
   return false;
  }
 });
 
 var answer = function(el) {
 // checks whether any index is true
  return el === true;
 
};

 return trueOrFalse.some(answer); // return true/false
}
Using a regular expression is definitely the way to go — that's exactly what they are good at doing.  The following regex looks for 'a', followed by any number of spaces, followed by a non-space character, followed by any number of spaces, followed by a non-space character, followed by any number of spaces, followed by 'b'. 



function bThreeAfterA(str) {
    return /a *[^ ] *[^ ] *b/.test(str);
}

console.log('after badly', bThreeAfterA('after badly'));
console.log('Laura sobs', bThreeAfterA('Laura sobs'));




You should be aware, though, that you are using .some() suboptimally.  The .some(callback) method stops executing as soon as the callback returns a true value.  But you've already built trueOrFalse by analyzing the entire string, instead of taking advantage of that short-circuiting.  Therefore, if you use .some(), you shouldn't also use .map().



function bThreeAfterA(str) {
    // Array of characters without spaces
    var chars = str.split(' ').join('').split('');
    return chars.some(function(c, i, chars) {
        return c == 'a' &amp;&amp; chars[i + 3] == 'b';
    });
}

console.log('after badly', bThreeAfterA('after badly'));
console.log('Laura sobs', bThreeAfterA('Laura sobs'));