【问题标题】:looping a string inside replace() method in JavaScript在 JavaScript 中的 replace() 方法中循环字符串
【发布时间】:2017-12-30 12:26:51
【问题描述】:

我有两个字符串,第二个字符串是从包含NaN 对象的数组转换而来的。我尝试使用replace() 方法将每个NaN 替换为第一个字符串中的一个字符。尽管在一个单独的函数中循环遍历一个字符串很顺利,但当我将它作为第二个参数插入replace() 方法时,它只给了我第一个字符串的第一个字符。我应该改变什么?

这是单独的函数,它可以工作:

function proceed(str){
  var newStr ='';
  for (i = 0; i < str.length; i++) {
    console.log(newStr += str[i]);
  }
  return newStr;
}
proceed('ab2c');

/* Output: */
// a
// ab
// ab2
// ab2c

但是,当我将它插入replace() 方法时,我得到了不正确的结果(存储在变量result 中)

let ReverseMe = function (parameter) {
  let extractedString = parameter.replace(/[^a-z]/gi, ""); 
  let extractedStringArray = extractedString.split(""); 
  extractedStringArray.reverse();
  let joinedExtracted= extractedStringArray.join();

  let newArray = parameter.split(""); 
  let mixedArray = newArray.map(Number); 
  let joinedMixed = mixedArray.join();

  let result = joinedMixed.replace(/NaN/g, 
    joinedExtracted.charAt(function (str) {
      var newStr ='';
      for (i = 0; i < str.length; i++) {
        newStr += str[i];
      }
  }));
  console.info(result);
}

ReverseMe('ab2c');

// Output: c,c,2,c
// Expected: cb2a

【问题讨论】:

  • ab2c获取cb2a的逻辑是什么。
  • 这只是我应用到提取的字母数组 (extractedStringArray) 并转换回应用了 join() 方法的字符串的 reverse() 方法。结果存储在一个新的反向字符串joinedExtracted中,进入循环时为'cba'。

标签: javascript string loops replace


【解决方案1】:

更新:

由于您的评论,我更新了答案以符合您提到的标准。

function reverseMe(string) {
  var chars = string.split('');
  var array = chars.map(Number);
  chars = chars.filter(char => isNaN(Number(char)));
  
  return array.map(item => isNaN(item) ? chars.pop() : item).join('');
}

var theString = reverseMe("ab2c");

console.log(theString);
// → cb2a

console.log(reverseMe("1abc2zyx3w"));
// → 1wxy2zcb3a

console.log(reverseMe("a1b2c"));
// → c1b2a

旧答案:

如果您目前的意图只是反转字符串,您可以非常简单地做到这一点,如下所示:

function reverseMe(string) {
  var newString = '';
  for (var i = string.length - 1; i >= 0 ; i--) {
    console.log(newString += string[i]);
  }
  return newString;
}

var theString = reverseMe("ab2c");
// → c
// → c2
// → c2b
// → c2ba

console.log(theString);
// → c2ba

但是,在您的代码中,问题在于joinedExtracted.charAt(function(str)... 没有将任何数字作为参数,因为传入参数function(str) {...} 的函数返回未定义

所以charAt()隐式认为参数为0,因此返回第一个字母“c”,给你“cc2c”;

【讨论】:

  • 感谢您的回复。但是,目标不是简单的字符串反转,出现在输入字符串中的数字应该出现在输出字符串中的相同位置。我的代码的先前版本适用于由字母和数字的线性交替组成的输入,例如“a1b2c”:for( var i = 0; i &lt; mixedArray.length; i++ ){ if (isNaN(mixedArray[i])) { mixedArray[i] = extractedStringArray[i]; // last iteration: [ 'c', 1, 'b', 2, 'a' ] } },但输入“abc12d”的结果不正确。
  • 非常优雅的分辨率。太棒了!
  • 我做到了,但它说要公开我的意见,我需要有 15 分的声誉,而现在我只有 8 分。只要我有这 15 分,我就对你的回答投赞成票将对其他人可见。
猜你喜欢
  • 2011-12-10
  • 2019-06-21
  • 1970-01-01
  • 2020-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多