带拼接的文本替换不适用于微笑(或多字节字符)
Text replacements with splice do not work with smiles (or multibyte chars)
我对复杂的替换算法有疑问。最后我能够将问题减少到这个最小的代码:
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 有一种奇怪的方式来处理字节位置和字符索引。所以这个问题是由笑脸引起的。
我怎样才能修复我的代码,使替换工作按预期进行?奖金问题为什么会这样?
嗯,很快:
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(''))
当我使用输出数组作为输入时,索引按预期工作并且我的替换再次工作。但是,我会给任何可以解释为什么需要更改的人接受状态。
我对复杂的替换算法有疑问。最后我能够将问题减少到这个最小的代码:
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 有一种奇怪的方式来处理字节位置和字符索引。所以这个问题是由笑脸引起的。
我怎样才能修复我的代码,使替换工作按预期进行?奖金问题为什么会这样?
嗯,很快:
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(''))
当我使用输出数组作为输入时,索引按预期工作并且我的替换再次工作。但是,我会给任何可以解释为什么需要更改的人接受状态。