一个简单的问题,但我无法弄清楚。也许我应该使用不同的方法。我想只在运行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
答案 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>
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;
答案 3 :(得分:1)
如何使用正则表达式?
function nearbyAZ(str) {
return str.search(/a\w{0,2}z/) !== -1;
}
答案 4 :(得分:1)
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