JavaScript array.length 在元素被推入后保持为 0
JavaScript array.length remains 0 after elements been pushed in
我正在编写一个括号验证函数,似乎在某些情况下 tmpStack.length
即使在某些元素被推入之后仍然 0
。
对于像 "[(1+2)]"
或 "[(1+2]"
这样的正常输入,函数有效,但对于像 "[12"
这样的输入,它不起作用,因为 tmpStack.length
仍然是 0
。另一个困扰我的问题是,如果输入是像 [
这样的单个括号,函数 returns true
尽管它应该在初始验证中失败。
function validator(str){
var flag=true;
var tmpStack=[];
var sliced = str.split("");
if (str.length<1 &&
((str!="(") || (str!=")") || (str!="[") ||
(str!="]") || (str!="{") || (str!="}")))
return flag;
else {
for(var i =0;i<=str.length;i++){
if((sliced[i]=="[") || (sliced[i]=="{") || (sliced[i]=="("))
tmpStack.push(sliced[i]);
else {
if((sliced[i]=="]" && tmpStack.pop()!="[") || (sliced[i]=="}" && tmpStack.pop()!="{" ) || (sliced[i]==")" && tmpStack.pop()!="("))
{
console.log("dis-match found for: "+(sliced[i]));
flag=false;
break;
}
}
}
}
if(tmpStack.length % 2)
return flag;
else
return !flag;
}
var tstStr="[+1";
console.log(validator(tstStr));
当您发现错误时,您需要从函数中 return,我认为:
return false;
而不是
flag=false;
break;
我也没看懂:
if(tmpStack.length % 2)
return flag;
else
return !flag;
似乎数组中是否还剩下任何东西 - 如果应该 return false:
return tmpStack.length ? false : true;
或者只是
return !tmpStack.length
已更新
重构解决方案:
function validator(str){
var tmpStack = [];
for (var i = 0; i < str.length; i++) {
if (str[i].match(/\[|\{|\(/)) {
tmpStack.push(str[i]);
} else if (
(str[i]=="]" && tmpStack.pop()!="[") ||
(str[i]=="}" && tmpStack.pop()!="{" ) ||
(str[i]==")" && tmpStack.pop()!="(")
) {
console.log("dis-match found for: " + (str[i]));
return false;
}
}
return !tmpStack.length;
}
var tstStr="[+]()1";
console.log(validator(tstStr));
我正在编写一个括号验证函数,似乎在某些情况下 tmpStack.length
即使在某些元素被推入之后仍然 0
。
对于像 "[(1+2)]"
或 "[(1+2]"
这样的正常输入,函数有效,但对于像 "[12"
这样的输入,它不起作用,因为 tmpStack.length
仍然是 0
。另一个困扰我的问题是,如果输入是像 [
这样的单个括号,函数 returns true
尽管它应该在初始验证中失败。
function validator(str){
var flag=true;
var tmpStack=[];
var sliced = str.split("");
if (str.length<1 &&
((str!="(") || (str!=")") || (str!="[") ||
(str!="]") || (str!="{") || (str!="}")))
return flag;
else {
for(var i =0;i<=str.length;i++){
if((sliced[i]=="[") || (sliced[i]=="{") || (sliced[i]=="("))
tmpStack.push(sliced[i]);
else {
if((sliced[i]=="]" && tmpStack.pop()!="[") || (sliced[i]=="}" && tmpStack.pop()!="{" ) || (sliced[i]==")" && tmpStack.pop()!="("))
{
console.log("dis-match found for: "+(sliced[i]));
flag=false;
break;
}
}
}
}
if(tmpStack.length % 2)
return flag;
else
return !flag;
}
var tstStr="[+1";
console.log(validator(tstStr));
当您发现错误时,您需要从函数中 return,我认为:
return false;
而不是
flag=false;
break;
我也没看懂:
if(tmpStack.length % 2)
return flag;
else
return !flag;
似乎数组中是否还剩下任何东西 - 如果应该 return false:
return tmpStack.length ? false : true;
或者只是
return !tmpStack.length
已更新
重构解决方案:
function validator(str){
var tmpStack = [];
for (var i = 0; i < str.length; i++) {
if (str[i].match(/\[|\{|\(/)) {
tmpStack.push(str[i]);
} else if (
(str[i]=="]" && tmpStack.pop()!="[") ||
(str[i]=="}" && tmpStack.pop()!="{" ) ||
(str[i]==")" && tmpStack.pop()!="(")
) {
console.log("dis-match found for: " + (str[i]));
return false;
}
}
return !tmpStack.length;
}
var tstStr="[+]()1";
console.log(validator(tstStr));