对于loop.if-仅在经过所有间隔后返回true
For loop..if - Return true only after all intervals pass
这是一个有点简单的问题,但我想不通。也许我应该用一种不同的方法。只有在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;
}
如果你想让你的函数返回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()的第二个参数来确定下一个z与a相关的位置:
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
相关文章:
- 对于loop.if-仅在经过所有间隔后返回true
- 如果函数返回True,则显示Javascript按钮
- Javascript If else 只返回 TRUE 或只返回 FALSE
- 过滤器返回true或false
- 我对“;返回true"嵌套函数内部;t工作
- 如何在成功输入时使“返回TRUE”
- 检查一个元素是否有一个类与另一个类总是返回true
- JavaScript函数未返回true
- 如果URL中有任何字符串变体匹配,则返回true
- 如何使以下函数返回true或false
- 使用“in”关键字检查 0 始终返回 true
- hasOwnProperty 在对照父对象属性进行检查时返回 true
- 为什么 isNaN 总是返回 true
- _.数组中的每个查找值都返回 true 或 false.使用下划线 JS
- 错误地返回true
- 为什么asp:LinkButton服务器端事件没有'当clientClick返回true时,t激发
- 阻止表单提交 javascript 为什么有一个明显的错误语句返回 true
- Node js命令器args返回true而不是值
- 如何将html表单与php链接,以便在例如单击按钮时返回true
- 从OnClientClick调用函数时,在JavaScript中返回true