Reputation: 1725
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
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
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
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