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
  • 679
  • 1
  • 9
  • 25
  • 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
  • 179,482
  • 20
  • 216
  • 275
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
  • 84,957
  • 6
  • 91
  • 136