【问题标题】:Change string on each loop iteration在每次循环迭代时更改字符串
【发布时间】:2018-12-13 12:21:41
【问题描述】:

我有以下问题: 我有一个字符串,我需要替换不同的正则表达式部分。

因此我想遍历它:

在我的例子中,它是一个 URL,我想为特定参数清空:

cleanURL(url, params) {
  params.forEach((param) => {
  url = this.updateUrlParameter(url, param, '');
});

而我有:

updateUrlParameter(url, param, value) {
  const regex = new RegExp(`(${param}=)[^&]+`);
  const newURL = url.replace(regex, `$1${value}`);
  return newURL;
}

这是我让它工作的唯一方法,但现在我正在重新分配一个函数参数。 这不是我想要的。

我的问题是,那个

cleanURL(url, params) {
  params.forEach((param) => {
    this.updateUrlParameter(url, param, '');
  });
}

每次迭代都会将 SAME url 传递到循环中。我最终只得到了最后一个替换。

不知何故,我不得不将更改后的字符串传递到下一个循环迭代中。

我怎样才能做到这一点? 也许朝这个方向发展? 以某种方式嵌套并再次调用该函数?

while(outerI--){
  (function(i){
    i+=1;//doesn't affect outerI and you wanted 1-length so we add one.

    //crap inside your forEach loop but without the i++
  })(outerI)
}

我在这里找到的: .forEach loop: use variable

很高兴在这里得到提示。 谢谢

干杯

【问题讨论】:

标签: javascript regex for-loop replace


【解决方案1】:

在这个用例中重新分配函数参数会很好。

如果您出于某种原因确实不想重新分配函数参数,您可以引入一个新变量来为您存储更新后的 URL。

cleanURL(url, params) {
    let newUrl = url;
    params.forEach((param) => {
        newUrl = this.updateUrlParameter(newUrl, param, '');
    });
    return newUrl;
}

【讨论】:

  • 我想我试过这个,但一定是搞砸了。我很快就会试试这个(现在不能)。看起来比我的递归函数简单...
  • 当然,如果可以的话就试一试吧 :) 如果还有什么不符合您的要求,请告诉我
  • 哇,我一定犯了其他错误。这确实有效。我可以发誓我试过这个......无论如何。谢谢。
【解决方案2】:

如果您不想改变参数,请使用临时变量来保存结果。

function updateUrlParameter(url, param, value) {
  const newURL = url + param;
  return newURL;
}

function cleanURL(url, params) {
  let temp = url;
  params.forEach((param) => {
    temp = updateUrlParameter(temp, param, '');
  });
  return temp;
}

const params = [1, 2, 3, 4, 5];
const url = 'string';
console.log(cleanURL(url, params));

【讨论】:

  • 谢谢。这与 NikxDa postet 的解决方案相同。不过我认为 NikxDa 更快 :)..
【解决方案3】:

String.prototype.replace 不会修改原始字符串,而是创建一个新字符串。

如果您更新您的 clearUrl 方法以在每次迭代中重新分配 url 您应该得到所有参数的替换

cleanURL(url, params) {
  params.forEach((param) => {
    url = this.updateUrlParameter(url, param, '');
  });
}

【讨论】:

  • 他清楚地提到他有这个工作,但不想重新分配函数参数。因此,我认为这不是 OP 正在寻找的......
【解决方案4】:

同时我也找到了办法:

cleanURL(url, params) {
  const paramsLength = params.length;
  const cleanURL = url;

  const recursive = (i, originalURL) => {
    this.log('i: ', i);
    this.log('originalURL: ', originalURL);
    if (i > 0) {
      const changedURL = this.updateUrlParameter(originalURL, params[i - 1], '');
      return recursive(i - 1, changedURL);
    }
    return originalURL;
  };
  // this.log('url: ', url);
  return recursive(paramsLength, cleanURL);
}

updateUrlParameter(url, param, value) {
  const regex = new RegExp(`(${param}=)[^&]+`);
  // this.log('regex: ', regex);
  const newURL = url.replace(regex, `$1${value}`);
  // this.log('newURL: ', newURL);
  return newURL;
}

对此有什么想法?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-07
    • 2016-07-29
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    相关资源
    最近更新 更多