我的代码只有在块按特定顺序排列时才有效

My code only works if blocks are in a certain order

我正在 Javascript 中编写一个函数来检查字符串参数是否有平衡括号。

平衡括号:

该函数遍历给定的字符串并检查每个括号类型 ()、[]、{},以查看是否存在正确的一对。 该方法是遍历字符串以检查左括号,如果找到,则遍历字符串的其余部分以查找相应的右括号,然后删除该对。每个代码块都对每种不同的括号类型执行此操作。最后,如果有任何杂散的右括号或左括号,它将 return false,否则它将 return true。

在 运行 我的代码在一串平衡括号 ({[]}) 上测试后,我发现它只有在我检查括号时才有效按照它们在字符串中出现的顺序。我不确定为什么这些块的顺序会影响它的工作方式。用“else if”而不是“if”连接条件句没有任何影响。

function hasBalancedBrackets(string) {
    var stringArray = string.split('');
        
    for (var i = 0; i < stringArray.length; i++) {
        
        if (stringArray[i] === '(') {
            for (var j = i+1; j < stringArray.length; j++) {
                if (stringArray[j] === ')') {
                    stringArray.splice(i, 1);
                    stringArray.splice(stringArray.indexOf(')'), 1);
                    break;
                }
            }
        }

        if (stringArray[i] === '{') {
            for (var l = i+1; l < stringArray.length; l++) {
                if (stringArray[l] === '}') {
                    stringArray.splice(i, 1);
                    stringArray.splice(stringArray.indexOf('}'), 1);
                    break;
                }
            }
        }

        if (stringArray[i] === '[') {
            for (var k = i+1; k < stringArray.length; k++) {
                if (stringArray[k] === ']') {
                    stringArray.splice(i, 1);
                    stringArray.splice(stringArray.indexOf(']'), 1);
                    break;
                }
            }
        }
    }

    console.log('stringArray:', stringArray); // to check that all the bracket pairs have been removed
    if (stringArray.indexOf('(') === -1 && stringArray.indexOf('[') === -1 && stringArray.indexOf('{') === -1 && stringArray.indexOf(')') === -1 && stringArray.indexOf(']') === -1 && stringArray.indexOf('}') === -1) {
        return true;
    } else {
        return false;
    }
}

// Assertion functions and test suite

function assertEqual(actual, expected, testName) {
    if (actual === expected) {
        console.log(`Passed [${testName}]`);
    } else {
        console.log(`FAILED [${testName}] Expected "${expected}", but got "${actual}"`);
    }
}

// tests

// input has balanced brackets, part 2
var actual4 = hasBalancedBrackets('({[]})');
assertEqual(actual4, true, 'Returns true when input string has balanced brackets');

代码块的顺序和对函数的影响:

最外层的 for 块递增索引 i 但内部代码从数组中删除元素。因此,如果内部代码从数组中删除任何内容,当外部循环再次为 运行 时,它会跳过新的第一个元素。

{}()[]

第一个 运行 外循环删除 {} 和 []

现在 stringArray 是 ()

外循环的第二个 运行 现在从索引 1 开始,即 ),因此它找不到该对。