最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - return value inside foreach - Stack Overflow

programmeradmin4浏览0评论

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?

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?

Share Improve this question asked May 27, 2016 at 23:59 RicardoERicardoE 1,7256 gold badges24 silver badges42 bronze badges 4
  • 10 The system pletely ignores values returned from .forEach() callbacks. – Pointy Commented May 28, 2016 at 0:02
  • 1 How did you expect it to behave? – Oriol Commented May 28, 2016 at 0:02
  • And what exactly are you trying to do? – charlietfl Commented May 28, 2016 at 0:05
  • Take this simplified but equivalent example: function foo() { function bar() { return 42; }; return 21; }. What does foo() return? – Felix Kling Commented May 28, 2016 at 0:12
Add a ment  | 

3 Answers 3

Reset to default 2

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"

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 bination 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;

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
});
发布评论

评论列表(0)

  1. 暂无评论