初学javascript,如何编写反向迭代

New to javascript, how to write reverse iteration?

本文关键字:迭代 何编写 javascript 初学      更新时间:2023-09-26

我目前正在大学里学习CIS入门课程,其中一个项目是javascript。它被分成两个不相关的部分,我可以做第二部分,但我被第一部分困住了。我的教授想让我写一个迭代,它将以相反的顺序显示我在提示屏幕上写的任何名字。所以如果我写"John Smith",它会显示"htims nhoj"。问题是我不知道怎么写。

<html>
   <body>
      <script>
         var namIn = window.prompt("Enter name:" );  
         var namAr = namIn.split("");  
         var namArLen = namAr.length;
         document.write(namAr + "<br /> Length: " + namArLen);
     </script>
   </body>
</html>

JavaScript中的字符串有一个称为split()的函数,该函数将它们转换为数组。JavaScript中的数组有一个叫做reverse()的函数来颠倒它们的顺序,还有一个叫做join()的函数来把它们转换回字符串。您可以将这些组合成:

"John Smith".split("").reverse().join("")

这回报:

"htimS nhoJ"

也,我不知道这是否是一个打字错误,但是你可以抛出一个toLowerCase()来获得你的问题之后的100%:

"John Smith".split("").reverse().join("").toLowerCase()

的回报:

"htims nhoj"

对于标题中的问题,可以在最后一个参数中指定for循环的方向,如下所示:

var reversed = [];
var name = "John Smith".split("");
for(var i = name.length-1; i >= 0; i--) {
    reversed.push(name[i]);
}
console.log(reversed.join(""));

将输出:

"htimS nhoJ"

不需要将这个字符串拆分为数组。只需使用charAt()函数和一个简单的for循环。

var name = window.prompt("Enter name:");
var reverse = "";
for (var i = name.length - 1; i >=0; i--) {
    reverse += name.charAt(i);
}
console.log(reverse)

不是先将字符串转换为数组,而是直接从字符串中读取字符。

只需迭代一半的字符数即可实现此目的。

演示: http://jsfiddle.net/vgG2P/

代码

:

var name = "Bob Dylan".split("");
//                    The counters will meet in the middle.
//                    --------------+----------------------
//      first char   last char      |   inc  dec
// -------v-------------v-----------v----v----v
for(var i = 0, j = name.length-1; i < j; i++, j--) {
    var temp = name[i];  // Store the `i` char
    name[i] = name[j];   // Replace the `i` char with the `j` char
    name[j] = temp;      // Replace the `j` char with the `i` char we stored
}
console.log(name.join(""));  "nalyD boB"

解释:

我们所做的是将字符分割成一个数组,并维护两个计数器,一个从0的第一个字符开始递增,另一个从.length - 1的最后一个字符开始递减。然后简单地交换字符。

当递增计数器小于递减计数器时,迭代继续。因为它们会在中间相遇,你最终只会增加总长度的一半。


也可以在不使用Array的情况下构建结果的一半:

演示: http://jsfiddle.net/vgG2P/1/

var name = "Bob Dylan";
var start = "", end = ""
for(var i = 0, j = name.length-1; i < j; i++, j--) {
    end = name.charAt(i) + end
    start += name.charAt(j)
}
if (i === j)
    start += name.charAt(i)
console.log(start + end);  "nalyD boB"

我想如果你的教授还没有向你介绍数组和循环的概念,他就不会问你如何反转字符串。基本上,像John Smith这样的字符串就是这样的字符数组:

0123456789
John Smith

再一次,考虑到字符串只是一个字符数组,你有10个字符需要反转。那么你该怎么做呢?嗯,你基本上需要从你给出的"数组"中获取最后一个字符h,并将其作为你将要创建的新"数组"中的第一个字符。下面是一个例子:

var known = 'John Smith';
var reversed = ''; // I'm making an empty string aka character array
var last = known.length - 1 // This is the index of the last character
for (var i = 0; i < known.length; i++)
{
  temp += known[last - i];
}

(你可以看到它在这里工作)

发生了什么?

  • 我们循环known从0开始到9结束(从第一个字符到最后一个字符)
  • 在每次迭代中,i从0到9递增
  • last的值总是9
  • last - i将为我们提供倒序索引(9,8,7,…), 0)
  • 因此,当i为0时,last - i为9,known[9]为"h";重复这个过程,你会得到反向字符串

希望这有助于更好地解释当你在数组上调用reverse()时发生的事情。

(1)不使用内置函数的更直接的方法:

function reverse(str) {
    let reversed_string = "";
    for (let i = str.length - 1; i >= 0; i--) {
        reversed_string += str[i];
    }
    return reversed_string;
}

(2)使用ES2015 'for'辅助函数:

function reverse(str) {
    let reversed_string = "";
    for (let character of str) {
        reversed_string = character + reversed_string;
    }
    return reversed_string;
}

(3)使用ES6语法和ES5.1 reduce():

function reverse(str) {
    return str.split('').reduce((reversed, char) => char + reversed, '');
}
// reduce takes in 2 arguments. (1) arrow function, and (2) empty string.

很有可能,在面试中,你将无法使用内置函数,特别是"reverse()"。