1

我对复杂的替换算法有疑问。最后,我能够将问题减少到这个最小的代码:

const input="test  hello test world"
let start = 0
let output = [...input]
const replacements = []
for (let end = 0; end <= input.length; end++) {
    const c = input[end]
    if (c == ' ') {
        if (start !== end) {
            const word = input.substring(start, end).toLowerCase()
            if (word == 'test') {
                replacements.push({start, length:(end - start), text:'REPLACEMENT'})
            }
        }
        start = end + 1
    }
}
for(let i=replacements.length-1;i>=0;i--) {
    output.splice(replacements[i].start, replacements[i].length, replacements[i].text)
}
console.log(output.join(''))

我的输入是"test hello test world",预期的输出是"REPLACEMENT hello REPLACEMENT world",但实际上是"REPLACEMENT hello tREPLACEMENTworld"。我记得在 Twitter API 中,JavaScript 有一种奇怪的方式来处理字节位置和字符索引。所以这个问题是由笑脸引起的。

如何修复我的代码,以便替换按预期工作?额外的问题为什么会发生这种情况?

4

1 回答 1

0

那很快:

const input="test  hello test world"
let start = 0
let output = [...input]
const replacements = []
for (let end = 0; end <= output.length; end++) {
    const c = output[end]
    if (c == ' ') {
        if (start !== end) {
            const word = output.slice(start, end).join('').toLowerCase()
            if (word == 'test') {
                replacements.push({start, length:(end - start), text:'REPLACEMENT'})
            }
        }
        start = end + 1
    }
}
for(let i=replacements.length-1;i>=0;i--) {
    output.splice(replacements[i].start, replacements[i].length, replacements[i].text)
}
console.log(output.join(''))

当我使用输出数组作为输入时,索引按预期工作,我的替换再次工作。但是,我会给任何人接受的状态,他们可以解释为什么需要进行更改。

于 2021-08-14T21:05:19.487 回答