首页 > 解决方案 > 为什么 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 作为方括号,但它不起作用。

标签: javascriptarraysalgorithmbrackets

解决方案


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

请注意,您的代码的制作方式不适用于嵌套括号/括号。您还应该小心使用indexOffind 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("()[]{}"));


推荐阅读