2

I have a function that checks if a param exists in an array of inputs. It should return false but does not.

{
  ...
  validation: params => {
    const valid = ["valid", "inputs"];
    valid.forEach( v=> {
      if (!params.hasOwnProperty(v)) {
        return false;
      }
    });

    return true;
  }

So even when the if statement does evaluate to be true it never return false. This function always returns true no matter what.

Joshua Blevins
  • 689
  • 1
  • 10
  • 27
  • Because the `return false` stmt is of you callback's return stmt.try setting a boolean in callback and return on basic of that or use for loop instead. – Aagam Jain Sep 27 '18 at 03:06
  • 1
    Possible duplicate of [Short circuit Array.forEach like calling break](https://stackoverflow.com/questions/2641347/short-circuit-array-foreach-like-calling-break) – NullPointer Sep 27 '18 at 03:06
  • If someone can post how I could refactor this code to work the way I intend I can accept that as the answer. – Joshua Blevins Sep 27 '18 at 03:07

2 Answers2

7

As an alternative, use the right tool for the job. If you want to check whether every member of an array has a certain property, use every:

validation: params => {
  const valid = ["valid", "inputs"];
  return valid.every(v => params.hasOwnProperty(v));
}
Amadan
  • 191,408
  • 23
  • 240
  • 301
4

You're return is returning from the callback function of forEach not the main function. You can't return early from a forEach without something like a throw. If you want to return early use a for...of loop instead:

validation: params => {
    const valid = ["valid", "inputs"];
    for (v of valid) {
      if (!params.hasOwnProperty(v)) {
      return false;  // this returns from the main function
    }
  };

  return true;
}
Mark
  • 90,562
  • 7
  • 108
  • 148