user3164317
user3164317

Reputation: 195

Javascript – creating "some" function

Trying to create "some" function. i.e., return true if any of the elements in teh array satisfies the condition

function some(array, predicate) {
  for (var i = 0; i < array.length; i++) {
    if (predicate(array[i]))
      return true;
  }
  return false;
}

console.log(some([NaN, 3, 4], isNaN));
// → true
console.log(some([2, 3, 4], isNaN));
// → false

Question 1: Above is the solution in the book and I'm not sure why "return false" would overwrite "return true" in every case. The above solution seems to suggest that "return false" will be run only if "return true" was never run – WHY??

My solution looked like this.

var some = function(array, condition) {
  var answer = false;
  for(var i=0; i<array.length; i++) {
    if(condition(array[i])) {answer = true}; 
  }
  return answer
};

Question 2: Is the book solution better because it takes less memory (ie the "answer" variable)?

Thanks!

Upvotes: 3

Views: 83

Answers (5)

Nina Scholz
Nina Scholz

Reputation: 386604

You can use the built in method of Array, some():

var test = [NaN, 3, 4].some(isNaN); // true

Upvotes: 1

Roko C. Buljan
Roko C. Buljan

Reputation: 206121

What that function does is

function some(array, predicate) {           // return a boolean value (true, false)
                                            // as soon an Array key matches `predicate`

  for (var i = 0; i < array.length; i++) {
    if (predicate(array[i])) return true;   // if Array key isNaN exit function as `true`
  }
  // We're 1. already out of the function or 2. all keys are looped.
  // This function needs to return a boolean so exit with `false`
  // since all Array keys are Numbers
  return false;                             

}

the above explains it all. Remember the part that says:
"return a boolean value (true, false) as soon an Array key matches predicate"
In your example, you're not exiting the function, so if you passed for example an
array of 1000 keys, every single key would be looped, which the function is not meant to do since it's purpose it to:

Return (exit) as true if at least one key matches the predicate condition

looping all other keys is useless since we already discovered that one key matches.

Yes, var consumes interpreter memory (nothing to worry about).

Upvotes: 0

doremi
doremi

Reputation: 15329

The solution in the book is predicated on the fact that the return keyword used within the body of a for loop will cause the loop to stop execution and return.

Take a look at the at the Interrupt a function section of the return documentation, which states:

The return statement ends function execution and specifies a value to be returned to the function caller.

In your example, as soon as the condition is matched, the book's solution will no longer continue to iterate through the array and will return (since that's what return does per the definition above).

Let's look at your solution:

var some = function(array, condition) {
  var answer = false;
  for(var i=0; i<array.length; i++) {
    if(condition(array[i])) {answer = true}; 
  }
  return answer
};

What happens if the condition is met? You're setting the answer to true, but the loop will continue to check subsequent elements in the array.

Consider the use case where the array is very large and you want to find a specific value within the array.

Which do you think would be more efficient: the one that stops after it finds the match or the one that returns the match only after having looking at all elements?

In this case, the answer is the latter. Don't keep looping through all elements if you've already found what you need.

Upvotes: 2

Domino
Domino

Reputation: 6768

When the execution hits a return statement, it leaves the current function regardless of which block it was in within that function.

As soon as an array element corresponds to the predicate, it returns true. If the execution exits the for loop normally, it means not a single value was valid, so we can return false.

The book's answer is better, not because it doesn't create an extra variable (that doesn't matter), but because it doesn't check all variables every time. As soon as an array element is valid, it exits the function.

Upvotes: 1

Travis J
Travis J

Reputation: 82287

return controls where the execution pointer is located for the currently executing script. When return is encountered it moves the execution pointer out of the function, and as a result, the function will stop executing. This means that if return true is executed, return false will not be.

Upvotes: 2

Related Questions