所以我有点困惑,我正在解决 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 许可协议
正如其他答案所解释的那样,这是没有意义的:
因为
array#forEach
根本不关心其辅助函数的返回值。它只是为每个数组元素执行辅助函数。您可以使用 worker 函数设置外部变量:
但是有更好的方式来表达这一点。
可以解释为 “集合中的 每个 元素在特定键上都有真实值”。
可以解释为 “集合中的 所有 元素在特定键处都没有虚假值(或完全缺少键)。”
或者,由于
Array#none
方法实际上并不存在, “集合中没有 某些 元素在特定键上具有虚假值。”使用
Array#some
的优点是,一旦满足其寻找的条件,它就会停止迭代数组。如果您的阵列有很多元素,这将意味着提高性能。对于短数组,使用Array#every
或Array#forEach
没有太大区别。以上在语义上等同于
由于 JS 对象只是返回
undefined
当您访问尚未设置的密钥时,检查hasOwnProperty
在这里是多余的。