在每次循环迭代时更改字符串

时间:2018-12-13 12:21:41

标签: javascript regex for-loop replace

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

因此,我想遍历它:

在我的情况下,它是一个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

Woudl很高兴在这里给出提示。 谢谢

欢呼

4 个答案:

答案 0 :(得分:1)

在此用例中,重新分配功能参数会很好。

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

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

答案 1 :(得分:1)

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

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));

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

与此同时,我也找到了一种方法:

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;
}

对此有何想法?