Loop should not be used when only a single iteration is needed

  • USELESS_LOOP
  • Code Quality
  • Low
  • No tags

This rule applies when an unconditional break, return or throw is used inside a loop body.

When a control flow statement like break, return, or throw statement is used in a loop without a condition, the enclosing loop will not repeat but execute only once.

For code readability and maintainability, it is recommended to use simpler if statement instead of the loop that executes only once. Also, it might be a mistake that the programmer forgets to check a condition before executing the control flow statement.

Note: Not applied for for-in or for-of loop because this pattern is often used for checking an empty array or object.

Noncompliant Code Example

View with compliant examples side by side
// Example 1
function doSomethingIfArrIsNotEmpty(arr) {
    for (var i = 0; i < arr.length; i++) { // USELESS_LOOP alarm because the enclosing 'for' can be refactored to 'if'.
        doSomething(arr[i]);
        break;
    }
}

// Example 2
function getEnclosingTable(tdElem) {
    var elem = tdElem;
    while (elem.parentNode) { // USELESS_LOOP alarm because a condition is missing at the 'return' statement.
        elem = elem.parentNode;
        return elem;
    }
    throw new Error("No enclosing table");
}

Compliant Code Example

View with noncompliant examples side by side
// Example 1
function doSomethingIfArrIsNotEmpty(arr) {
    if (arr.length > 0) {
        doSomething(arr[0]);
    }
}

// Example 2
function getEnclosingTable(tdElem) {
    var elem = tdElem;
    while (elem.parentNode) {
        elem = elem.parentNode;
        if (elem.tagName === "TABLE") {
            return elem;
        }
    }
    throw new Error("No enclosing table");
}

Version

This rule was introduced in DeepScan 1.24.0.