繁体   English   中英

为什么我的for循环返回正确的答案,但我的forEach没有?

[英]Why does my for loop return the correct answer, but my forEach does not?

这是我关于SO的第一个问题。 我有一个赋值,我应该创建一个有两个参数的函数 - 第一个是字符串数组,第二个是可能在数组中匹配的字符串。

我有两个函数变体:一个使用“for”循环,另一个使用.forEach()方法。 for循环准确地返回“true”/“false”,具体取决于数组中是否存在第二个参数。 forEach总是返回“false”。

有人可以解释原因吗? 代码如下:

.forEach()版本:

function insideArray (array, word) {
  var value;
  array.forEach(function(each) {
    if(each === word) {
      value = "true";
      return value;
    }
    else {
      value = "false";
    }
  });
  return value;
}

for loop版本:

function insideArray (array, word) {
  var value;
  for(var i = 0; i < array.length; i++) {
    if(array[i] === word) {
      value = "true";
      return value;
    }
    else {
      value = "false";
    }
  }
  return value;
}

示例数组:

var heroArray = [ "spiderman", "wolverine", "batman", "greenArrow", "boosterGold" ];

测试.forEach():

insideArray(heroArray, "spiderman");
"false"

测试循环:

insideArray(heroArray, "spiderman");
"true"

在此先感谢您的帮助!

发生这种情况是因为您从forEach的回调函数返回而不是从insideArray()所以最终insideArray()将始终返回false,除非您匹配数组中的最后一个元素。 您可以通过使用false初始化值并删除其他条件来修复代码,如下所示:

function insideArray (array, word) {
  var value = "false";
  array.forEach(function(each) {
    if(each === word) {
      value = "true";
    }
  });
  return value;
}

另请注意,您可以使用indexOf为此编写更简单的代码:

function insideArray (array, word) {
  return array.indexOf(word) >= 0 ? "true" : "false";
}

.forEach方法不返回任何内容,因此我将代码修改为以下内容:

function insideArray (array, word) {
  var value = "false";
  array.forEach(function(each) {
    if(each === word) {
      value = "true";
    }
  });
  return value
};

你不能break / return出的阵列#的forEach循环,尽管你可以throw ,并catch从它的(但没有)。 如果您打算像那样进行测试,那么数组#可能是更好的选择。 一个更好但虽然稍微不太受支持的方法是使用Array#includes可以使用 polyfill,或者使用babel进行转换 )。 另一种解决方案是Array#indexof

 function insideArray(array, word) { return String(array.some(function(each) { return each === word; })); } var heroArray = ['spiderman', 'wolverine', 'batman', 'greenArrow', 'boosterGold']; console.log(insideArray(heroArray, 'supergirl')); console.log(insideArray(heroArray, 'batman')); 

 const insideArray = (array, word) => String(array.includes(word)); const heroArray = ['spiderman', 'wolverine', 'batman', 'greenArrow', 'boosterGold']; console.log(insideArray(heroArray, 'supergirl')); console.log(insideArray(heroArray, 'batman')); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM