使用JavaScript中的循环将“-”替换为“ _”

时间:2018-07-08 04:52:18

标签: javascript

我在c ++中应用了相同的方法将“-”替换为“ _”,它可以正常工作,但在javascript中,它根本不能替换。

function replace(str)
{
    for(var i=0;i<str.length;i++)
    {
        if(str.charAt(i)=="-")
        {
            str.charAt(i) = "_";
        }
    }
    return str;
}

3 个答案:

答案 0 :(得分:4)

它在javascript中非常简单,真的不值得创建新功能:

function replace(str){
  return str.replace(/-/g, '_') // uses regular expression with 'g' flag for 'global'
}

console.log(replace("hello-this-is-a-string"))

但这不会更改原始字符串,因为javascript中的字符串是不可变的。

如果您对避免使用内置函数不屑一顾(也许您想进行更复杂的处理),reduce()可能会有用:

function replace(str){
  return [...str].reduce((s, letter) => s += letter == '-' ? '_' : letter , '')
}

console.log(replace("hello-this-is-a-string"))

答案 1 :(得分:1)

您可以使用.split()和.join()轻松替换完整的字符串。

function replace(str){
  return str.split("-").join("_");
}

console.log(replace("hello-this-is-a-string"))

答案 2 :(得分:0)

这是“确保您阅读错误消息”的另一种情况。如果是

str.charAt(i) = "_";

关于发生的事情的正确描述并非像您将要拥有的那样“根本没有取代”;它是“它会生成运行时JavaScript错误”,在Chrome中用“

Uncaught ReferenceError: Invalid left-hand side in assignment

在Firefox中是

ReferenceError: invalid assignment left-hand side

这应该为您提供了查找问题所需的线索。

我重复:仔细阅读错误消息。然后再读一次。在大多数情况下,它们可以准确地告诉您问题出在哪里(如果您只花时间尝试去理解它们),或者至少可以为您指明正确的方向。

当然,阅读错误消息是假设您知道如何查看错误消息。你呢?在大多数浏览器中,通常通过 F12 可以使用开发工具窗口,该窗口包含一个“控制台”,显示错误消息。如果您不了解devtools或控制台,那么请确保在编写一行代码之前了解它们。

或者,您可能只是在Stack Overflow上进行了搜索,因为(几乎)所有问题都已经在那里被问到了,尤其是那些新来者。例如,我在Google中搜索

  

我可以在JavaScript中使用charat替换字符串中的字符吗?

第一结果是How do I replace a character at a particular index in JavaScript?,它具有400多个投票,第一个并被接受的答案也是如此:

  

在JavaScript中,字符串是不可变的,这意味着您可以做的最好的事情是创建一个具有更改内容的新字符串,然后将变量分配为指向它。

在学习编程或学习新语言时,不可避免地会遇到您不知道的事情或使您感到困惑的事情。该怎么办?张贴到堆栈溢出几乎总是 worst 的替代方法。毕竟,正如您所知,它不是教程站点,也不是帮助站点,也不是论坛。这是一个有关有趣的编程问题的问答网站。

在最好的情况下,您会得到时髦的评论和答案,这会毁掉您的一天;在最坏的情况下,您将被否决,并被否决,这不仅令人尴尬,而且实际上可能会阻止您将来提出问题。由于您想确保自己能够在真正需要的时候提出问题,因此最好不要花更多的时间进行研究,包括Google和SO搜索发布前简单的初学者问题。或者找到一个旨在帮助新朋友的论坛。或询问您旁边的人是否有一个。或浏览一个或多个教程。

但是为什么要自己写呢?

但是,除非您正在解决此问题以作为一种自学JavaScript的方法,并且作为一种培训活动,否则根本没有理由编写它。在计算历史中,它已经被编写了数百甚至数千次。这些实现中的绝大多数将比您将要编写的东西更好,更快,更干净,漏洞更少,功能更强大。因此,作为“程序员”的工作不是写一些将破折号转换为下划线的东西。可以找到使用

正如智者所说,今天我们不再写算法了。我们将API调用串在一起。我们的工作是找到并理解要调用的API。

使用Google根本不难找到API。在这种情况下,如果您知道有时将带下划线的字符串称为“小写大写”,可能会有所帮助,但是即使您不知道可以在查询结果的第一页上找到某些内容,例如“ javascript将字符串转换为使用下划线库”。

第一个结果(您应该看一下)是underscore.string,这是一组字符串工具的集合,它们是根据多功能“下划线”库的精神编写的,旨在与之配合使用。它提供了一个名为underscored的API。除了处理“反序列化”输入(您的情况)之外,它还处理其他字符串/标识符格式,例如“ camelCase”。

即使您不想导入此特定库并使用它(您可能应该这样做),也最好窃取或克隆其code,简化形式为:

str
  .replace(/([a-z\d])([A-Z]+)/g, '$1_$2')
  .replace(/[-\s]+/g, '_')

这并不像看起来那么复杂。第一部分是处理camelCase的输入,因此"catsAndDogs“变成"cats-and-dogs"。第二行是处理破折号和空格的行)。仔细观察-它替换了 runs 带有单个下划线的多个破折号。这很容易也是您想要执行的操作,具体取决于谁在下游处理转换后的字符串。这是其他人为此编写专业级库的完美示例任务认为您编写自己的解决方案时可能不会。

请注意,这个备受赞誉的,经过精心设计的库并没有使用split/join技巧在字符串中进行全局替换,如另一个答案所示。大约十年前,这种方法已经失效。

除了省去自己编写代码的麻烦,并获得更好的代码外,如果您花时间了解它的作用,您还将最终对正则表达式有更多的了解。