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

时间:2019-03-27 14:10:13

标签: javascript arrays algorithm brackets

我有此代码:

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作为方括号,但是它不起作用。

2 个答案:

答案 0 :(得分:4)

您可以使用一个对象作为预期的结束符,如果找到了一个开放字符,则将预期的结束符推入堆栈。

否则请对照字符检查弹出的值。

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("["));

答案 1 :(得分:3)

由于拼接会更改长度,因此您会通过查看日志来注意到测试中跳过[,]的原因(reduce步骤中的当前索引与该数组不对应更多)。拼接时,您可能应该使用副本而不是原始数组,并测试该数组:

请注意,编写代码的方式不适用于嵌套的括号/括号。您还应该注意使用indexOf来找到cur,因为它会返回找到的第一个,如果您更改代码,它可能与实际的cur不符。

var isValid = function(s) {
    let arr = [...s], copy = [...s];

    arr.reduce((acc, cur) => {
        console.log(`arr in reduce: ${arr}`);
        console.log(`copy in reduce: ${copy}`);
        console.log(`acc: ${acc}`);
        console.log(`cur: ${cur}`);
        if ((acc && cur)
        && (
            (acc === '(' && cur === ')')
            || (acc === '{' && cur === '}')
            || (acc === '[' && cur === ']')
        )) {
            copy.splice(copy.indexOf(acc), 2);
            console.log(`copy after splice: ${copy}`);
            return arr;
        }
        else {
            console.log(`else statement: ${cur}`);
            return cur;
        }
    });

    return copy.length === 0 ? true : false;
};

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