在.map()

时间:2019-05-02 10:45:29

标签: javascript if-statement pop

问题

我已经创建(或尝试创建)一个JS函数,该函数忽略特殊字符反转字符串。连续2个特殊字符时,功能不起作用

代码

我提供了以下所有重现问题所需的代码。包括一些可以使用mocha运行的测试。 第二项测试失败。

以下代码通过测试:

const assert = require('assert');

const reverseButNoSpecial = (str) => {
    const specialChars = /[^a-zA-Z ]/g;

    // create an array withOUT special chars
    const cleanArray = str.replace(specialChars, "").split('');

    // iterate over the original
    // replace each letter with a letter from the clean array,
    // leave the special chars
    return str.split('').map(char => {
        if (specialChars.test(char)) {
            return char;
        }
        // remove the last char from the reversed array
        const removed = cleanArray.pop();
        // return the char that was removed
        return removed;
    }).join('');
}

describe('Reverse all characters except special chars', () => {
    it ('should work for a,b$c!', () => {
        expected = 'c,b$a!';
        actual = reverseButNoSpecial('a,b$c!');
        assert.strictEqual(expected, actual);
    })

    it ('should work for Ab,c,d$$e!', () => {
        expected = 'ed,c,b$$A!';
        actual = reverseButNoSpecial('Ab,c,d$$e!');
        assert.strictEqual(expected, actual);
    })
})

预期vs实际

预期reverseButNoSpecial('Ab,c,d$$e!')返回ed,c,b$$A!但得到ed,c,b$A!

(请注意,$仅应出现两次,$$

有人可以帮我找出原因吗?

1 个答案:

答案 0 :(得分:2)

重新使用全局搜索的正则表达式对象时会出现“陷阱”。正则表达式对象保持状态,特别是lastIndex属性保持不变。

这是一个很好的解释: https://siderite.blogspot.com/2011/11/careful-when-reusing-javascript-regexp.html

要解决此问题,请不要使用“ specialChars”对象,而只需使用正则表达式对象raw,如下所示:

  

(/ [^ a-zA-Z] / g).test(char)