【问题标题】:While loop should be appending closed parentheses to end of string but string not modifiedWhile 循环应将右括号附加到字符串的末尾,但未修改字符串
【发布时间】:2020-09-09 23:29:15
【问题描述】:

我编写了一个函数,该函数接受一个包含括号的字符串,遍历该字符串并使用 for 循环计算开括号和闭括号的数量。然后,当开括号的数量大于闭括号的数量时,while 循环应该在字符串上循环,并将闭括号附加到字符串。我的示例代码:

function closeThoseParens(string) {
let openTicker = 0;
let closedTicker=0;
for (let i = 0; i < string.length; i++) {
    if (string[i] === '(') {
        openTicker++;
        console.log(openTicker);
    } else if (string[i] === ')') {
        closedTicker++;
    }
}

while (openTicker > closedTicker){
    string += ")"
    closedTicker++;
    console.log(closedTicker);
}}

调用函数:

let string = '((( )';
closeThoseParens(string)

应该导致字符串 '((( )))' 的值 然而,从函数返回的值似乎只是输入字符串。记录到控制台时,代码显示预期值。

我不确定这里发生了什么,我尝试追加到字符串变量末尾的方式似乎有问题,但我不确定它可能是什么。

【问题讨论】:

  • 您不是在修改原始字符串,而是在修改名为 string 的局部变量。这就是为什么每次迭代都必须将加法结果重新分配回string 的原因。与其尝试改变参数,通常最好还是返回一个新参数。

标签: javascript string while-loop append concatenation


【解决方案1】:

您不是在修改原始字符串,而是在修改名为string 的局部变量。这就是为什么每次迭代都必须将加法的结果重新分配回string

如果您不熟悉按引用传递与按值传递的概念,您可以跳过这一段。在 JS 中,字符串是按值传递的。这实际上意味着您正在获取字符串的副本,因此您无法修改原始值。如果 JS 通过引用传递字符串,您将能够修改原始字符串而不必返回新字符串。 (免责声明:这是非常简化的,我试图用这些概念的新手可以理解的术语来解释这一点。)

与其尝试改变参数,通常最好还是返回一个新参数。即使对于可以修改原始对象(在一定程度上)的对象也是如此。这是一种函数式编程范式,它试图避免难以理解(和调试)的副作用。

要使其正常工作,您可以执行以下操作

function closeThoseParens(string) {
  let openTicker = 0;
  let closedTicker=0;
  let closedParens = string;

  for (let i = 0; i < string.length; i++) {
    if (string[i] === '(') {
      openTicker++;
      console.log(openTicker);
    } else if (string[i] === ')') {
      closedTicker++;
    }
  }

  while (openTicker > closedTicker){
    closedParens += ")"
    closedTicker++;
    console.log(closedTicker);
  }

  return closedParens;
}

console.log(closeThoseParens('((( )'));

【讨论】:

  • 这是有道理的,而且有效!感谢您的明确解释。
  • 没问题,很高兴它有帮助。
猜你喜欢
  • 1970-01-01
  • 2018-06-25
  • 2017-12-28
  • 2022-12-11
  • 2014-03-06
  • 2017-09-29
  • 2020-08-19
  • 1970-01-01
  • 2017-01-20
相关资源
最近更新 更多