【问题标题】:JavaScript: Replace certain occurrence of string depending on selection indexJavaScript:根据选择索引替换某些出现的字符串
【发布时间】:2018-06-15 05:38:41
【问题描述】:

我创建了自己的自动完成功能,并且遇到了一个我想修复的错误。这是一个不完整句子的示例,我可能想自动完成最后一个单词:

let text = 'Hello there, I am her'

在我的功能中,用户点击ctrl + enter 并通过页面上显示的建议自动完成单词。在这种情况下,假设建议在“这里”。我的控制器也知道用户在哪里基于插入光标(所以我有索引)。

如果我像这样使用替换:

text.replace(word, suggestion);

(单词是“她”,建议是“这里”)它将替换第一次出现。显然,这个词在文本中的位置有无数种组合,如何在text 字符串中的某个索引处替换一个?我知道我可以通过一些混乱的if 条件来做到这一点,但是有没有一种优雅的方式来做到这一点?

(如果相关,我将为此使用 angular keydown/keyup)

编辑>>>>> 这不是链接问题的重复,因为在这种情况下,它们总是替换最后一次出现。如果我这样做了,那么我的程序将不支持用户返回他们的句子并尝试在那里自动完成一个新单词

【问题讨论】:

标签: javascript angularjs keydown


【解决方案1】:

因此,您在字符串中有一个位置和许多要替换的字符(=不完整单词的长度)。在这种情况下,这行得通吗?

let text = 'appl and appl and appl'

function replaceAt(str, pos, len, replace) {
    return str.slice(0, pos) + replace + str.slice(pos + len);
}

console.log(replaceAt(text, 0, 4, 'apple'))
console.log(replaceAt(text, 9, 4, 'apple'))

【讨论】:

  • 这很好用,谢谢!我实际上拥有的是词尾的索引,但这是一个快速修复。由于某种原因,现在如果我替换较早出现的其中一个,它会将我的插入光标移动到字符串的末尾,但这是一个不同的(不太重要的)问题......
  • DeejC 虽然这个答案是一个不错的选择,但看看@ split() 和 join() 函数,它们非常适合字符串操作。
【解决方案2】:

将为您指明一个可以帮助您入门的方向。

let sentence = 'Hello lets replace all words like hello with Hi';
let fragments = sentence.split(' ');
for (let i=0; i<fragments.length; i++){
 if(fragments[i].toLowerCase() == 'hello')
   fragments[i] = 'Hi'
}
let formattedsentence = fragments.join(' ');
console.log(formattedsentence); //"Hi lets replace all words like Hi with Hi"

【讨论】:

  • 如果数组包含重复值,您会很难找到所需的片段数组的索引吗?我觉得会有点乱
  • 片段将包含您想要的任何索引,由您决定要更改哪个索引。在上述情况下,我也加入了一个 .toLowerCase() 来匹配那些。这是您必须在循环中添加的额外逻辑,以提取您想要修改的内容以及您不想修改的内容。
  • 就我而言,它找到了 2 个匹配项。如果我不使用 .toLowerCase(),它只会找到 1。
  • 如果有 2 个 'hello' 实例,然后您找到 2 个匹配项,您如何知道根据原始 sentence 的索引选择哪个匹配项?
  • 在我的示例中,它将选择您指定的任何内容。在这种情况下,它是 'hello' 和任何 'hello' 的实例,不管它是大写还是小写。
猜你喜欢
  • 2021-01-28
  • 1970-01-01
  • 2018-08-23
  • 2016-08-28
  • 1970-01-01
  • 2012-02-17
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多