0

In the code below, I am looping through the 'words' array and comparing it to the query. It should return false if they are different and if the length is not the same.

For some reason, when called, the 'isMatch' function is not returning true inside the if statement of the 'isMember' function and is always returning false. What am I missing?

const words = ['foo', 'bar', 'baz']

const isMember = (words, query) =>{
  words.forEach(w => {
    if(isMatch(w, query)){
      return true
    }
  })
  return false
  
}



function isMatch(word, query){
  if(word.length !== query.length){
    return false
  }

  for(let i = 0 ; i < word.length ; i++){
    if(word[i] !== query[i] && query[i] !== '*'){
      return false
    }
  }
  return true
}




console.log(isMember(words, 'foo'))  /*expected outcome: true*/
console.log(isMember(words, 'hello')) /*expected outcome: false*/
console.log(isMember(words, 'f*o')) /*expected outcome: true*/
console.log(isMember(words, '**'))  /*expected outcome: false*/
console.log(isMember(words, '*az')) /*expected outcome: true*/
  • 2
    Your `return true;` is *inside* the `.forEach()` callback. The `.forEach()` method completely ignores any returned values from its callback. – Pointy Mar 12 '21 at 06:39

2 Answers2

0

You are returning the result inside the loop and after loop. while function call end of the return value is executed. so declare the function scope variable let and assign the result

const words = ['foo', 'bar', 'baz']

const isMember = (words, query) => {
  let res = false;
  words.forEach(w => {
    if (isMatch(w, query)) {
      res = true
    }
  })
  return res
}



function isMatch(word, query) {
  if (word.length !== query.length) {
    return false
  }

  let res = true;
  for (let i = 0; i < word.length; i++) {
    if (word[i] !== query[i] && query[i] !== '*') {
      res = false
    }
  }
  return res
}




console.log(isMember(words, 'foo')) /*expected outcome: true*/
console.log(isMember(words, 'hello')) /*expected outcome: false*/
console.log(isMember(words, 'f*o')) /*expected outcome: true*/
console.log(isMember(words, '**')) /*expected outcome: false*/
console.log(isMember(words, '*az')) /*expected outcome: true*/
prasanth
  • 22,145
  • 4
  • 29
  • 53
0

You pass a callback function to forEach, so return inside it will return from the callback function, not from isMember.

  • Use a different type of array iterator method (.some):

    const words = ['foo', 'bar', 'baz']
    
    const isMember = (words, query) =>{
      return words.some(w => isMatch(w, query))
    }
    
    
    
    function isMatch(word, query){
      if(word.length !== query.length){
        return false
      }
    
      for(let i = 0 ; i < word.length ; i++){
        if(word[i] !== query[i] && query[i] !== '*'){
          return false
        }
      }
      return true
    }
    
    
    
    
    console.log(isMember(words, 'foo'))  /*expected outcome: true*/
    console.log(isMember(words, 'hello')) /*expected outcome: false*/
    console.log(isMember(words, 'f*o')) /*expected outcome: true*/
    console.log(isMember(words, '**'))  /*expected outcome: false*/
    console.log(isMember(words, '*az')) /*expected outcome: true*/
  • ...or a for..of loop, from which you can return:

    const words = ['foo', 'bar', 'baz']
    
    const isMember = (words, query) =>{
      for(const w of words){ 
        if(isMatch(w, query))
          return true
      }
      return false
    }
    
    
    
    function isMatch(word, query){
      if(word.length !== query.length){
        return false
      }
    
      for(let i = 0 ; i < word.length ; i++){
        if(word[i] !== query[i] && query[i] !== '*'){
          return false
        }
      }
      return true
    }
    
    
    
    
    console.log(isMember(words, 'foo'))  /*expected outcome: true*/
    console.log(isMember(words, 'hello')) /*expected outcome: false*/
    console.log(isMember(words, 'f*o')) /*expected outcome: true*/
    console.log(isMember(words, '**'))  /*expected outcome: false*/
    console.log(isMember(words, '*az')) /*expected outcome: true*/
FZs
  • 16,581
  • 13
  • 41
  • 50