【问题标题】:Changing individual characters in a string does not work in a loop [duplicate]更改字符串中的单个字符在循环中不起作用[重复]
【发布时间】:2016-11-06 01:44:18
【问题描述】:

所以,我正在做一些练习题。我的代码似乎工作正常,直到我决定循环遍历字符串以将句点的任何实例替换为空。由于某种原因,循环不起作用。我想这与不以某种方式调用它有关,但我不确定如何调用循环。我认为循环会自动覆盖它们循环的内容。这是练习和我不完整的解决方案:

编写一个 JavaScript 函数来参数化一个字符串。

function string_parameterize(string) {
    var lowercase_string = string.toLowerCase();
    var split_string = lowercase_string.split(" ");
    var joined_string = split_string.join("-");
    for (i = 0; i < joined_string.length; i++) {
        if (joined_string[i] === ".") {
            joined_string[i] === "";
        }
    }
    return joined_string;
}

//Test Data :
console.log(string_parameterize("Robin Singh from USA."));

答案应该是robin-singh-from-usa,不带句号,但它一直显示为robin-singh-from-usa.,带句号。

【问题讨论】:

  • 等号太多——joined_string[i]===""应该是joined_string[i]=""
  • 你的 if 中没有作业。
  • 你试过joined_string.replace(/\./g, ''); -- 这样你就不必遍历整个字符串并将所有句点(。)替换为''。
  • 将“===”更改为“=”无效。什么任务会进入if?我也想在不使用正则表达式的情况下做到这一点,因为我还没有学会它。我正在尝试让循环工作,但它不起作用。
  • 关闭选民:问题不仅仅是印刷错误。是的,代码中有一个错字,joined_string[i] === ""; 本来应该是joined_string[i] = "";。但是,即使该错误得到纠正,代码仍然无法正常工作。因此,“off-topic:typographical error”不是有效/准确的关闭原因。

标签: javascript loops


【解决方案1】:

其他答案没有考虑到 JavaScript 中的字符串是不可变的。您不能更改字符串中的单个字符。你建立一个新的字符串。

在 JavaScript 中,字符串是不可变的。尝试更改字符串中的字符不起作用:

function string_parameterize(string) {
    var lowercase_string = string.toLowerCase();
    var split_string = lowercase_string.split(" ");
    var joined_string = split_string.join("-");
    for (i = 0; i < joined_string.length; i++) {
        if (joined_string[i] === ".") {
            joined_string[i] = "";
        }
    }
    return joined_string;
}

//Test Data :    
console.log(string_parameterize("Robin Singh from USA.")); //This will not work:

您可以使用for 循环构建一个新字符串,将每个不是. 的字符单独添加到newString

function string_parameterize(string) {
    var lowercase_string = string.toLowerCase();
    var split_string = lowercase_string.split(" ");
    var joined_string = split_string.join("-");
    var newString = '';
    for (i = 0; i < joined_string.length; i++) {
        if (joined_string[i] !== ".") {
            newString += joined_string[i];
        } //We are replacing '.' with nothing, '', so no need for an else
    }
    return newString;
}

//Test Data :
console.log(string_parameterize("Robin Singh from USA."));

正则表达式

不过,这通常使用Regular Expressions 来完成,特别是.replace() 方法:

function string_parameterize(string) {
    var lowercase_string = string.toLowerCase();
    var newString = lowercase_string.replace(/ /g,'-'); //Replace all spaces with '-'.
    var newString = newString.replace(/\./g,''); //Replace all '.' with nothing. The '.'
                                                 //  has to be quoted with \. as it
                                                 //  has special meaning in a RegExp.     
    return newString;
}
//Test Data :
console.log(string_parameterize("Robin Singh from USA."));

这可以在一个语句中完成:

function string_parameterize(string) {
    return string.toLowerCase().replace(/ /g,'-').replace(/\./g,'');
}
//Test Data :
console.log(string_parameterize("Robin Singh from USA."));

【讨论】:

  • 哇,谢谢!我还没有学习正则表达式,但我会研究一下。至于这部分... if (joined_string[i] !== ".") { newString += joined_string[i]; } ...你能解释一下这到底是什么意思吗?我把它读作“如果joined_string的索引不是句点,那么继续循环到newString?”
  • 我很高兴能够提供帮助。我不确定您要对评论中包含的代码说什么。至于正则表达式:它们是一个强大的工具;在许多情况下很有帮助。在某些情况下,它们是最好的工具,而在其他情况下,它们是不合适的。它们背后的概念在许多计算机语言中都很有用,但每种实现(语言)都可能存在细微差别。可能有助于学习它们的一件事是使用正则表达式测试器,但要确保它明确声明它使用 JavaScript 正则表达式。
  • 那么,在 newString += joined_string[i] 的那一行中,+= 是什么意思?我尝试在 Google 和 YouTube 上搜索 += 的含义,但找不到任何内容。
  • @Andrew, += is the Addition assignment operatornewString += joined_string[i]; 等价于 newString = newString + joined_string[i];。在这种情况下,它将joined_string[i] 的值连接到newString 的末尾,并将整个值分配给newString。我不确定为什么我最初不理解您的问题。这实际上是清楚和合理的。不知怎的,我读错了。 (续)
  • @Andrew,(续)代码:if (joined_string[i] !== ".") {newString += joined_string[i];} 说/做:如果当前字符不是.,则将当前字符添加到newString 的末尾。如果当前字符是 .(您要从字符串中删除的字符),这将导致不将当前字符添加到 newString。因为我们没有用任何东西替换它,'',所以我们没有ifelse{...} 子句。如果我们做的不仅仅是删除这些字符,我们将有一个 else{...} 来处理这种情况。
【解决方案2】:

您可以在输出中输入您不希望出现的每个字符[...]+

var res = string.toLowerCase().replace(/[%\(\)\.\s]+/g, "-").replace(/-$/, "");
                                      // ^ ^ ^   ^
                                      // Here the characters you don't want to have in the output

+ 表示匹配一次更多次。将匹配的字符替换为-

然后用-$ 删除最后一个-

总计

function string_parameterize(string) {
  var res = string.toLowerCase().replace(/[%\(\)\.\s]+/g, "-").replace(/-$/, "");
  return res;
}

console.log(string_parameterize("Это тест")); // A russian sentence
console.log(string_parameterize("Robin Singh%%() from USA.   "));
console.log(string_parameterize("Robin ...Singh    from USA....."));
console.log(string_parameterize("Robin Singh    from USA    "));
console.log(string_parameterize("Robin Singh    from USA"));

Info 关于正则表达式

【讨论】:

  • 虽然您的代码适用于提供的测试字符串,但在 JavaScript RegExp 中使用 \w\W 来表示单词和非单词字符通常是个坏主意。这是因为 \w\W 不考虑 Unicode 单词字符(例如,非英语语言的名称)。例如,尝试将“这是一个测试”翻译成通常不只使用 ASCII 字符的语言。例如:Google Translate translates that string 用俄语表示为“Это тест”。使用这样的字符串不适用于您的解决方案。
  • @Makyen,这是真的。非常感谢您的提示!我已经更正了我的答案。
【解决方案3】:
function string_parameterize(string) {
    var lowercase_string = string.toLowerCase();
    var split_string = lowercase_string.split(" ");
    var joined_string = split_string.join("-");
    joined_string = joined_string.replace(".", "");
    return joined_string;
}

//Test Data :
console.log(string_parameterize("Robin Singh from USA."));

This is working in IE.

【讨论】:

  • 虽然这将适用于特定的测试字符串,但它并不能满足 OP 的要求:“将 any instance 的句点替换为空”。当使用字符串作为String.prototype.replace() 的第一个参数时,仅替换第一次出现的字符串。
【解决方案4】:
function string_parameterize(str){
    return str.toLowerCase().replace(".", "").split(" ").join("-");
}
console.log(string_parameterize("Robin Singh from USA."));
//will result in: robin-singh-from-usa

您的代码不起作用,因为在 if 条件下,您正在检查 joined_string[i]==="." 是否等于 '.',实际上它等于 'USA.'。这就是为什么这个if 条件从未遇到并在最终结果中返回'.'

if (joined_string[i]===".") {
    joined_string[i]==="";
}

【讨论】:

  • 虽然这将适用于特定的测试字符串,但它并不能满足 OP 的要求:“将 any instance 的句点替换为空”。当使用字符串作为String.prototype.replace() 的第一个参数时,仅替换第一次出现的字符串。
【解决方案5】:

您正在检查 joined_string[i] 的值,而不是分配它。

joined_string[i] = "";

不是

joined_string[i] === "";

【讨论】:

  • 它仍然对我不起作用。
【解决方案6】:
Change:
if (joined_string[i]===".") {
            joined_string[i]==="";
        }
to 

if (joined_string[i]===".") {
            joined_string[i]="";
        }

【讨论】:

  • 它仍然对我不起作用。
猜你喜欢
  • 2014-05-24
  • 1970-01-01
  • 1970-01-01
  • 2020-01-22
  • 1970-01-01
  • 2020-05-18
  • 2022-01-22
  • 2018-04-07
  • 1970-01-01
相关资源
最近更新 更多