JavaScript array.length 在元素被推入后保持 0

JavaScript array.length remains 0 after elements been pushed in

本文关键字:array length 元素 JavaScript      更新时间:2023-09-26

我在编写一个括号验证函数,似乎在某些情况下,即使某些元素被推入,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));

当您发现错误时,您需要从函数返回,我认为:

return false;

而不是

flag=false; break;

我也没有理解:

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

似乎如果数组中有任何内容 - if 应该返回 false:

return tmpStack.length ? false : true;

或者只是

return !tmpStack.length

http://jsfiddle.net/m68j0926/

更新

重构的解决方案:

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));