为什么用reduce()跳过方括号?

我有以下代码:


var isValid = function(s) {

    let arr = [...s];


    arr.reduce((acc, cur) => {

        console.log(`arr in reduce: ${arr}`);

        console.log(`acc: ${acc}`);

        console.log(`cur: ${cur}`);

        if ((acc && cur)

        && (

            (acc === '(' && cur === ')')

            || (acc === '{' && cur === '}')

            || (acc === '[' && cur === ']')

        )) {

            arr.splice(arr.indexOf(acc), 2);

            console.log(`arr after splice: ${arr}`);

            return arr;

        }

        else {

            console.log(`else statement: ${cur}`);

            return cur;

        }

    });


    return arr.length === 0 ? true : false;

};


console.log(isValid("()[]{}"));

如果满足以下条件,则需要返回true:

  • 开括号必须用相同类型的括号封闭。

  • 开括号必须以正确的顺序关闭。

我的代码未通过此测试"()[]{}":它总是返回[,]并且我不明白为什么。我已经尝试使用正则表达式,anscii作为方括号,但是它不起作用。


慕尼黑的夜晚无繁华
浏览 171回答 2
2回答

牛魔王的故事

您可以使用一个对象作为预期的结束字符,如果找到了一个开放字符,则将预期的结束字符推入堆栈。否则,请对照该字符检查弹出的值。var isValid = function([...array]) {        var stack = [],            open =  { '(': ')', '[': ']', '{': '}' };        return array.every(c => c in open ? stack.push(open[c]) : c === stack.pop())            && !stack.length;    };console.log(isValid("()[]{}"));console.log(isValid("(({}[()]))[]{}"));console.log(isValid("()[]{}}"));console.log(isValid("["));
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript