每个...休息

时间:2009-12-11 17:15:45

标签: php javascript foreach

每当我从for-each构造(PHP / Javascript)中“破解”时,我都会感到很脏。

这样的事情:

// Javascript示例

for (object in objectList)
{
   if (object.test == true)
   {
      //do some process on object
      break;
   }

}

对于大型对象列表,我会经历麻烦,构建一个更优雅的解决方案。但对于小型列表,没有明显的性能问题,因此“为什么不呢?”它很快,更重要的是易于理解和遵循。

但它只是“感觉不对”。有点像goto声明。

你如何处理这种情况?

14 个答案:

答案 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。它很快,通常不会使事情复杂化。

如果您使用forwhiledo while循环,则可以使用变量来确定是否继续:

for ($i = 0, $c = true; ($i < 10) && $c; $i++) {
    // do stuff

    if ($condition) {
        $c= false;
    }
}

foreach循环中断的唯一方法是breakreturn

答案 13 :(得分:0)

使用

Object object;
int index = 0;

do
{
    object = objectList[index];
    index++;
}
while (object.test == false)

如果从for循环中断,会让您感到不安。