forEach/for...in 不返回值?

新手上路,请多包涵

所以我有点困惑,我正在解决 freeCodeCamp 上的挑战。

挑战 内容如下

一切都是真的

检查谓词(第二个参数)在集合的所有元素(第一个参数)上是否为真。

它已经解决了,但我不明白为什么我必须采取额外的步骤。我的代码是这样的:

 function truthCheck(collection, pre) {
    collection.forEach(function(element) {
        for (key in element) {
            if (!element.hasOwnProperty(pre)) {
                return false;
            } else if (key === pre) {
                if (!Boolean(element[key])) {
                    return false;
                }
            }
        }
    });
    return true;
}

truthCheck([
    {"user": "Tinky-Winky", "sex": "male"},
    {"user": "Dipsy"},
    {"user": "Laa-Laa", "sex": "female"},
    {"user": "Po", "sex": "female"}
], "sex");

所以在这种情况下它应该失败,因为 collection 中的第二个元素没有 sex 属性。如果 pre 参数,或者在这种情况下 sex 不是真值,您也会收到失败消息。

当这些被击中时(它们是什么,我可以通过控制台日志来判断)但我认为它会跳出循环并从 truthCheck 函数返回……但它没有’ t,它最终会返回 true。

我能够通过定义一个变量然后将该值设置为 false 然后在最后返回该变量来规避这个问题。有没有更好的办法?看起来这些回报应该突破 truthCheck 功能?我错过了什么吗?

原文由 msmith1114 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 252
2 个回答

正如其他答案所解释的那样,这是没有意义的:

 collection.forEach(function () {
  // do something
  return false;
});

因为 array#forEach 根本不关心其辅助函数的返回值。它只是为每个数组元素执行辅助函数。

您可以使用 worker 函数设置外部变量:

 function truthCheck(collection, pre) {
  var allAreTruthy = true;
  collection.forEach(function (elem) {
    // if this ever flips allAreTruthy to false, it will stay false
    allAreTruthy = allAreTruthy && elem[pre];
  });
  return allAreTruthy;
}

但是有更好的方式来表达这一点。

检查谓词(第二个参数)在集合的所有元素(第一个参数)上是否为真。

可以解释为 “集合中的 每个 元素在特定键上都有真实值”。

 function truthCheck(collection, pre) {
  return collection.every(function (elem) { return elem[pre]; });
}

可以解释为 “集合中的 所有 元素在特定键处都没有虚假值(或完全缺少键)。”

或者,由于 Array#none 方法实际上并不存在, “集合中没有 某些 元素在特定键上具有虚假值。”

 function truthCheck(collection, pre) {
  return !collection.some(function (elem) { return !elem[pre]; });
}

使用 Array#some 的优点是,一旦满足其寻找的条件,它就会停止迭代数组。如果您的阵列有很多元素,这将意味着提高性能。对于短数组,使用 Array#everyArray#forEach 没有太大区别。

以上在语义上等同于

function truthCheck(collection, pre) {
  var i;
  for (i = 0; i < collection.length; i++) {
    if (!collection[i][pre]) return false;
  }
  return true;
}

由于 JS 对象只是返回 undefined 当您访问尚未设置的密钥时,检查 hasOwnProperty 在这里是多余的。

原文由 Tomalak 发布,翻译遵循 CC BY-SA 3.0 许可协议

您不能从 ForEach 循环返回任何内容。它会默认返回 undefined

作为官方文档, Array.prototype.forEach() - JavaScript | MDN 说:

除了抛出异常之外,没有其他方法可以停止或中断 forEach() 循环。 如果您需要这样的行为,则 forEach() 方法是错误的工具,请改用普通循环。如果您正在测试谓词的数组元素并需要布尔返回值,则可以改用 every() 或 some() 。

所以你可以使用一个非常简单的 for..in 循环,例如:

 for(var c in collection){
    // Do whatever you want
}

原文由 Blockost 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏