2016-05-17 2 views
1

Немного простого вопроса, но я не могу понять это. Возможно, я должен использовать другой метод. Я хочу вернуть true только после того, как все интервалы цикла for будут запущены и пройдут условие. Однако, поскольку у меня написан мой код, возврат к true или false выполняется после начального значения цикла. Код проверяет, находится ли буква «z» в строке 3 или меньше индексов после буквы «a». Как я могу исправить/оптимизировать свой код?Для loop..if - Вернуть true только после прохождения всех интервалов

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 

ответ

1

Keiwan's answer будет работать, если вы хотите, чтобы вернуть только справедливо, если есть «г» в течение трех символов после каждого «а». иначе он вернет false.

Если вы хотите, чтобы ваша функция возвращает истину, если есть «г» после любого «а», но не обязательно каждый «а», то вам необходимо сделать небольшую модификацию к этому коду:

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

return false; 

Это вернет true, если когда-нибудь случится, что «z» происходит с тремя буквами после «a».

Проблема с вашим исходным кодом была выражением «if else». Для каждого «а» вы проверяли, есть ли «z», а затем, если вы не возвращались к false, не проверяя другие «a». Таким образом, ваш первый «а» всегда заставил вас вернуть значение, и вы никогда не проверяли следующее:

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.

1

Вот упрощенная версия, которая использует второй параметр indexOf(), чтобы определить, где следующий г находится по отношению к :

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

1

Как об использовании регулярных выражений ?

function nearbyAZ(str) { 
    return str.search(/a\w{0,2}z/) !== -1; 
} 
+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; 
} 
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

Смежные вопросы