对于loop.if-仅在经过所有间隔后返回true

For loop..if - Return true only after all intervals pass

本文关键字:返回 true if- loop 经过 对于      更新时间:2023-09-26

这是一个有点简单的问题,但我想不通。也许我应该用一种不同的方法。只有在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

它不起作用的原因是,您必须将返回值false放在循环之外。

当它返回时,它将退出函数。

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;
}
如果您只想在每个"a"后面的三个字符内有一个"z"的情况下返回true,那么Keiwan的答案将有效。否则它将返回false。

如果你想让你的函数返回true,如果在任何"a"后面都有一个"z",但不一定每个"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;

如果"z"出现在"a"后面的三个字母内,则返回true。

原始代码的问题在于"if-else"语句。对于每个"a",你都会检查是否有"z",如果没有,你就会返回false,而不检查其他"a"。所以你的第一个"a"总是会迫使你返回一个值,而你从来没有检查过下面a的

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

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

这里有一个简化版本,它使用indexOf()的第二个参数来确定下一个za相关的位置:

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

使用regex怎么样?

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

为了完整起见,使用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