这样的事情:
// Javascript示例
for (object in objectList)
{
if (object.test == true)
{
//do some process on object
break;
}
}
对于大型对象列表,我会经历麻烦,构建一个更优雅的解决方案。但对于小型列表,没有明显的性能问题,因此“为什么不呢?”它很快,更重要的是易于理解和遵循。
但它只是“感觉不对”。有点像goto声明。
你如何处理这种情况?
答案 0 :(得分:27)
我休息一下。这是一个完美的解决方案。
答案 1 :(得分:5)
这很快,更重要的是易于理解和遵循。
不要为休息感到难过。 Goto很不满意,因为它很快,更重要的是 易于理解和遵循。
答案 2 :(得分:4)
请注意,休息时间不会让我感到烦恼 。编程在goto上构建,而for-break - 就像所有控制结构一样 - 只是一种特殊用途形式的goto ,旨在提高代码的可读性。 编写可读代码时不要感到难过!
现在,当使用类型转换相等运算符时,我做对于与true
,尤其是的直接比较感到肮脏...哦,是的。您撰写的内容 - if (object.test == true)
- 相当于撰写if (object.test)
,但需要更多思考。如果确实希望只有object.test
是布尔值和 true
才能成功,那么您将使用{{3} } ...否则,跳过它。
答案 3 :(得分:2)
对于小型列表,这样做没有问题。 正如您所提到的,您可能想要为大型列表(尤其是大小未知的列表)考虑更“优雅”的解决方案。
有时感觉不对,但没关系。你会及时学会爱break
。
答案 4 :(得分:2)
就像你说“”为什么不呢?“这很快,更重要的是易于理解和遵循。”
为什么感觉很脏,我觉得这没什么不对。
答案 5 :(得分:2)
我认为更容易阅读,因此更容易维护。
答案 6 :(得分:2)
它应该是这样的。 Break旨在跳出循环。如果你在循环中找到了你需要的东西,为什么要保持循环?
答案 7 :(得分:2)
休息和继续都没有。他们是有原因的。一旦完成循环结构,就会离开循环。
现在,我要避免的是非常非常深的嵌套(箭头设计反模式)。
if (someCondition)
{
for (thing in collection)
{
if (someOtherCondition)
{
break;
}
}
}
如果你打算休息一下,那么请确保你已经构建了你的代码,以便它只有一个级别。使用函数调用使迭代尽可能浅。
if (someCondition)
{
loopThroughCollection(collection);
}
function loopThroughCollection(collection)
{
for (thing in collection)
{
if (someOtherCondition)
{
doSomethingToObject(thing);
break;
}
}
}
function doSomethingToObject(thing)
{
// etc.
}
答案 8 :(得分:1)
我真的没有看到打破for循环的任何错误。除非你有某种哈希表,你可以通过某种键来获得一个值,但实际上没有别的办法。
答案 9 :(得分:1)
我会使用break
声明。
答案 10 :(得分:1)
一般来说break
语句没有错。但是,如果像这样的块出现在代码库的不同位置,则代码可能会成为问题。在这种情况下,break
语句对于重复代码来说代码很小。
您可以轻松地将搜索提取到可重复使用的功能中:
function findFirst(objectList, test)
{
for (var key in objectList) {
var value = objectList[key];
if (test(value)) return value;
}
return null;
}
var first = findFirst(objectList, function(object) {
return object.test == true;
}
if (first) {
//do some process on object
}
如果您始终以某种方式处理找到的元素,则可以进一步简化代码:
function processFirstMatch(objectList, test, processor) {
var first = findFirst(objectList, test);
if (first) processor(first);
}
processFirst(
objectList,
function(object) {
return object.test == true;
},
function(object) {
//do some process on object
}
}
因此,您可以使用JavaScript中的功能强大功能,使您的原始代码更具表现力。作为副作用,这会将break
语句从常规代码库中推出到辅助函数中。
答案 11 :(得分:0)
也许我误解了你的用例,但为什么要打破呢?我假设你期望测试对于列表中的至多一个元素是真的吗?
如果没有性能问题且您想要清理代码,您可以随时跳过测试和休息。
for (object in objectList)
{
//do some process on object
}
这样一来,如果你确实需要对多个元素进行处理,你的代码就不会破坏(双关语)。
答案 12 :(得分:0)
我的偏好是只使用break
。它很快,通常不会使事情复杂化。
如果您使用for
,while
或do while
循环,则可以使用变量来确定是否继续:
for ($i = 0, $c = true; ($i < 10) && $c; $i++) {
// do stuff
if ($condition) {
$c= false;
}
}
从foreach
循环中断的唯一方法是break
或return
。
答案 13 :(得分:0)
使用
Object object;
int index = 0;
do
{
object = objectList[index];
index++;
}
while (object.test == false)
如果从for
循环中断,会让您感到不安。