JSはかっこが合っているかどうかを判断します.

16323 ワード

まず*大文字のZDQ**ブロガーに対する感謝、霊感はここから来ました.
かっこが合うかどうかを判断する–JavaScript
与えられた文字列から、文字列の中の括弧()[]{}が規則的に対応しているかどうかを判断します.
考え方
括弧は必ず対になって現れます.文字列の中で出会った括弧は、その前の括弧とペアになります.
説明
マッチが正しい場合は、-1を返します.マッチが間違っている場合は、インデックス値を返します.
単純な判断ならブール値に変えてもいいです.
互換性のある書き方
function isValid(str){
    if(!str.trim()) return -1;
    var stack = [];
    var keys   = [')',']','}'];
    var values = ['(','[','{'];
    var isBreak = -1;
    for(var i=0;i<str.length;i++){
        var char = str.charAt(i);
        if(values.includes(char)){
            //   
            stack.push(char);

        }else{
            var index = keys.indexOf(char);
            if(index > -1){
                //   
                if(!stack.length || values[index] != stack.pop()){
                    isBreak = i;
                    break;
                }
            }
        }
    }
    if(isBreak > -1){
        return isBreak
    }
    return stack.length - 1
}
簡単な書き方
IEが互換性がないのは、主にES 6の文法が使われているからです.
function isValid(str){
    if(!str.trim()) return -1;
    var stack = [];
    var dict = {"]": "[", "}": "{", ")": "("};
    var values = Object.values(dict);
    var isBreak = -1;
    for(var i=0;i<str.length;i++){
        var char = str.charAt(i);
        if(values.includes(char)){
            stack.push(char);

        }else if(dict[char]){
            if(!stack.length || dict[char] != stack.pop()){
                isBreak = i;
                break;
            }
        }
    }
    if(isBreak > -1){
        return isBreak
    }
    return stack.length - 1
}
検証
document.write('() : '+isValid('()'));
document.write('
'
); document.write('()[]{} : '+isValid('()[]{}')); document.write('
'
); document.write('(] : '+isValid('(]')); document.write('
'
); document.write('([)] : '+isValid('([)]')); document.write('
'
); document.write('{[]} : '+isValid('{[]}')); document.write('
'
); document.write('(()()) : '+isValid('(()())')); document.write('
'
); document.write('((() : '+isValid('((()'));
参考:
https://blog.csdn.net/u010712012/article/details/83856371