推入元素后,JavaScript array.length仍为0

时间:2015-01-17 20:17:30

标签: javascript brackets

我正在写一个括号验证函数,在某些条件下似乎tmpStack.length仍然是0,即使在推入了一些元素之后。 对于"[(1+2)]""[(1+2]"这样的常规输入,该函数可以正常工作,但对于"[12"之类的输入,它不起作用,因为tmpStack.length仍为0。困扰我的另一个问题是,如果输入是[之类的单个括号,则函数返回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));

1 个答案:

答案 0 :(得分:0)

当你发现错误时,你需要从函数返回,我想:

return false;

而不是

flag=false; break;

我也没有做到这一点:

if(tmpStack.length % 2) return flag; else return !flag;

似乎任何东西都留在数组中 - 如果应该返回false:

return tmpStack.length ? false : true;

或只是

return !tmpStack.length

http://jsfiddle.net/m68j0926/

<强>更新

重构解决方案:

&#13;
&#13;
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));
&#13;
&#13;
&#13;