RicardoE
RicardoE

Reputation: 1725

return value inside foreach

So this is very weird, I have a foreach function like this:

  let cookieValue = '';

  cookieList.forEach(function(cookieItem) {
    const cookieParts = cookieItem.split('=');
    const value = cookieParts[1];
    const key = cookieParts[0];
    if (key.trim() === cookieName) {
      cookieValue = value;
      return cookieValue;
    }
  });

  return cookieValue;

which works fine, however when I change the lines inside the if statement to a single line:

return value;

It returns undefined always.

Any ideas of what can be happening here?

Upvotes: 4

Views: 14764

Answers (3)

Remo H. Jansen
Remo H. Jansen

Reputation: 24999

The return of forEach is ignored but you can use map and filter:

function getCookieValue(cookieList, cookieName) {
    var val = cookieList.map(function(cookieItem) {
        var cookieParts = cookieItem.split('=');
        var value = cookieParts[1];
        var key = cookieParts[0];
        return (key.trim() === cookieName) ? value : null;
    })
    .filter((value) => { return value != null })[0];
    return val;
}

let cookieValue = getCookieValue(["key1=val1", "key2=val2"], "key2"); // > "val2"

Upvotes: 2

michaelmesser
michaelmesser

Reputation: 3726

Your return value in the forEach function return in that function. By placing the return in the outer function, you return that value when that function is called. See this simplified example.

function x(){
    function y(){
        return 5 // Does not return in the x function
    }
    y() // = 5
    return 7
}
x() // =7

You seem like you are looking for Array.find.

let cookieValue = '';
return cookieList.find(function(cookieItem) {
  const cookieParts = cookieItem.split('=');
  const value = cookieParts[1];
  const key = cookieParts[0];
  return key.trim() === cookieName
});

Upvotes: 0

noisypixy
noisypixy

Reputation: 774

Your code works "fine" at first because you're manually changing the value of cookieValue.

Array.prototype.forEach doesn't do anything with the returning value of the callback you pass to it.

For this case, I'd use a combination of Array.prototype.map and Array.prototype.reduce:

let cookieValue = cookieList.map(function(cookieItem) {
  const cookieParts = cookieItem.split('=');
  const value = cookieParts[1];
  const key = cookieParts[0];
  if (key.trim() !== cookieName) {
    return null;
  }
  return value;
}).reduce(function(a, b) {
  return a || b;
}, '');

return cookieValue;

Upvotes: 0

Related Questions