For loop..if - 仅在所有间隔通过后返回true

时间:2016-05-17 17:35:14

标签: javascript if-statement

一个简单的问题,但我无法弄清楚。也许我应该使用不同的方法。我想只在运行for循环中的所有间隔并传递条件后才返回true。但是,当我编写代码时,返回true或false是在循环的初始值之后完成的。 代码测试字母' z'在一个字母' a'之后的字符串中是3个或更少的索引。 如何修复/优化我的代码?

function nearbyAZ(str) {
    var aIndex = [];
    if (str.length == 1) {
        return false;
    }
    for (var i = 0; i < str.length; i++){
        if (str[i] == 'a') {
            aIndex.push(i);
        }
    }
    for (var j = 0; j < aIndex.length; j++) {
        if (str.indexOf('z') <= aIndex[j] + 3 && str.indexOf('z') >= aIndex[j]) {
            return true;
        }
        else {
            return false;
        }
    }

}

console.log(nearbyAZ("abfz")) //true
console.log(nearbyAZ("abannz")) //should return true but false is returned before the second 'a' can be tested
console.log(nearbyAZ("a")) //false
console.log(nearbyAZ("z")) //false
console.log(nearbyAZ("za")) //false

6 个答案:

答案 0 :(得分:2)

它不起作用的原因是因为你必须在循环之外把你的返回假。

当它命中一个返回时它将退出该功能。

function nearbyAZ(str) {
    var aIndex = [];
    if (str.length == 1) {
        return false;
    }
    for (var i = 0; i < str.length; i++){
        if (str[i] == 'a') {
            aIndex.push(i);
        }
    }
    for (var j = 0; j < aIndex.length; j++) {
        if (str.indexOf('z') <= aIndex[j] + 3 && str.indexOf('z') >= aIndex[j]) {
            return true;
        }

    }
    return false;
}

答案 1 :(得分:1)

您可以将最后一个循环更改为:

for (var j = 0; j < aIndex.length; j++) {
    if (!(str.indexOf('z') <= aIndex[j] + 3) || !(str.indexOf('z') >= aIndex[j])) {
        return false;
    }
}

return true;

因此,如果在你的循环中你的条件是false(在任何时候)return false。如果一切顺利,你退出循环而不返回false,那么你可以return true

答案 2 :(得分:1)

这是一个简化版本,它使用indexOf()的第二个参数来确定下一个 z a 相关的位置:< / p>

&#13;
&#13;
function nearbyAZ(str) {
  var i, idx;
  
  for(i = 0 ; i < str.length ; i++) {
    if(str[i] === 'a') {
      idx = str.indexOf('z', i);  //returns -1 if not found
      if(idx > -1 && idx <= i + 3) {
        return true;
      }
    }
  }
  return false;
} //nearbyAZ

console.log(nearbyAZ("abfz")) //true
console.log(nearbyAZ("abannz")) //true
console.log(nearbyAZ("a")) //false
console.log(nearbyAZ("z")) //false
console.log(nearbyAZ("za")) //false
&#13;
&#13;
&#13;

答案 3 :(得分:1)

如何使用正则表达式?

function nearbyAZ(str) {
  return str.search(/a\w{0,2}z/) !== -1;
}

答案 4 :(得分:1)

如果只想在每个“a”之后的三个字符内有“z”,则

Keiwan's answer将起作用。否则它将返回false。

如果你希望你的函数在任何“a”之后有一个“z”时返回true,但不一定每个“a”,那么你需要对该代码稍作修改:

for (var j = 0; j < aIndex.length; j++) {
    if ((str.indexOf('z') <= aIndex[j] + 3) && (str.indexOf('z') >=    aIndex[j])) {
        return true;
    }
}

return false;

如果在“a”之后出现“z”并带有三个字母,则返回true。

原始代码的问题是'if else'语句。对于每个“a”,你检查是否有“z”然后如果没有你返回false,而不检查其他“a”。所以你的第一个“a”总是强迫你返回一个值而你从未检查过以下的一个

答案 5 :(得分:0)

为了完整性,使用Array#some()的函数和带有this对象的适当回调。

它适用于单个循环,没有indexOf或其他查找机制。

function nearbyAZ(str) {
    return str.split('').every(function (l, i, aa) {
        if (l === 'a') {
            this.lastA = i;
            this.hasZ = false;
        }
        if (l === 'z') {
            this.hasZ = i - this.lastA <= 3;
            return this.hasZ;
        }
        return i + 1 === aa.length ? this.hasZ : true;
    }, { lastA: -10, hasZ: false });
}

function print(s) {

    document.write(s + ': ' + nearbyAZ(s) + '<br>');
}

print("abfz");   // true
print("abannz"); // true
print("a");      // false
print("z");      // false
print("za");     // false