JS:使用嵌套循环反转字符串不起作用

时间:2017-10-08 23:53:35

标签: javascript arrays string nested reverse

我编写了一个名为var data = [ { entryId: 'ABC', mobile: '0123456789' }, { entryId: 'BBB', mobile: '1111111111' }, { entryId: 'CCC', mobile: '2222222222' } ]; var dataWithMobileNumbersOnly = data.map((obj) => { return { mobile: obj.mobile }; }); console.log(dataWithMobileNumbersOnly) // [{mobile: '0123456789'}, {mobile: '1111111111'}, {mobile: '2222222222'}] 的函数,它接受一个字符串作为参数并返回字符串,但字符反向。

例如:reverseStr => reverseStr('bootcamp');

以下是我的计划:



'pmactoob'




如果我运行函数function reverseStr(str) { var splitStr = str.split(""); console.log(splitStr); var reverseString = []; for(var i = 0; i <= splitStr.length -1 ; i++) { for(var j = splitStr.length - 1; j >= 0; j--) { reverseString[i] = splitStr[j] } } return reverseString.toString().replace(/[&\/\\#,+()$~%.'":*?<>{}]/g, ''); },则返回reverseStr("bootcamp")。 有没有人看到代码有问题?

注意:我不想使用bbbbbbbb内置功能

但是,我发现以下代码取得了成功,但仍需要回答我的初步问题

&#13;
&#13;
REVERSE()
&#13;
&#13;
&#13;

4 个答案:

答案 0 :(得分:1)

您不需要对字符进行双重迭代,即不需要嵌套for循环。迭代一次并以相反的顺序抓住字符,如下所示:

function reverseStr(str)
{
    var splitStr = str.split("");
    console.log(splitStr);
    var reverseString = [];
    for(var i = 0, j=splitStr.length-1; i <= splitStr.length -1 ; i++, j--)
    {
            reverseString[i] = splitStr[j]
    }

    return reverseString.toString().replace(/[&\/\\#,+()$~%.'":*?<>{}]/g, '');
}

你可以看到这里循环的持续时间与i <= splitStr.length -1一样长,即字符串的长度。这足以获得镜像字符(iArray.length-i)。

以下是演示的工作片段:

&#13;
&#13;
var reverseStr = function(str) {
  let result = String();
  for(let i = str.length-1; i >= 0; i--) {
    result += str.charAt(i);
  }
  return result.replace(/[&\/\\#,+()$~%.'":*?<>{}]/g, '');
}
$('button').click(function() {
  $('.result').text(reverseStr($('#str').val()));
});
&#13;
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <input type="text" id="str">
    <button>Reverse it</button>
    <div class="result"></div>
&#13;
&#13;
&#13;

实现相同的更优雅的方法(除了 Array.prototype.reverse())也许是使用String.prototype.chatAt()。这样可以避免两次与数组的转换,也可以保存一个变量。当然,代码更短,更明显。

&#13;
&#13;
var reverseStr = function(str) {
  let result = String(); // An empty string to store the result
  for(let i = str.length-1; i >= 0; i--) { // Iterate backwards thru the chars and add to the result string
    result += str.charAt(i);
  }
  return result.replace(/[&\/\\#,+()$~%.'":*?<>{}]/g, ''); // Original return method of the author
}
$('button').click(function() {
  $('.result').text(reverseStr($('#str').val()));
});
&#13;
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <input type="text" id="str">
    <button>Reverse it</button>
    <div class="result"></div>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

问题在于,嵌套的for循环在返回外部for循环之前会运行整个过程。因此,它只重复一个字符的次数等于长度。不要再使用其他for循环,只需在外j循环中为j++ for添加一个简单的计数器,并将该值与i值一起使用。

答案 2 :(得分:0)

对于原始海报,请考虑一下:

如果你知道原始字符串的长度,你就会知道原始字符串中最后一个位置的偏移量。

以相反的顺序迭代原始字符串,将当前位置的值附加到新字符串。新字符串将与原始字符串相反。

答案 3 :(得分:0)

Aydin的例子基本上是正确的。这是我非常相似的版本,有评论:

function reverseString(inputString) {
    // create a new empty string
    var newString = "";

    // iterate through the characters of the string in reverse order,
    // appending to the new string
    for (var i = inputString.length - 1; i >= 0; i--) {
        newString += inputString[i];
    }

    return newString;
}

console.log(reverseString('bootcamp'));