新手javascript,如何编写反向迭代?

时间:2013-05-17 23:33:07

标签: javascript

我目前正在我的大学学习CIS课程,其中一个项目是javascript。它被分成两个不相关的部分,我能够做第二部分,但我被困在第一部分。我的教授希望我写一个迭代,它会以相反的顺序显示我在提示屏幕中写的任何名字。因此,如果我写“约翰史密斯”,它将显示“受害者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>

5 个答案:

答案 0 :(得分:8)

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"

答案 1 :(得分:1)

无需将此字符串拆分为数组。只需使用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)

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

答案 2 :(得分:1)

你可以通过迭代只有一半的字符来实现这一点。

  

DEMO: http://jsfiddle.net/vgG2P/

CODE

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的最后一个字符递减。然后只需交换字符。

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


我们也可以在不使用数组的情况下构建结果的一半:

  

DEMO: 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"

答案 3 :(得分:0)

如果他还没有向您介绍数组和循环的概念,我假设您的教授不会问您如何反转字符串。基本上,像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];
}

You can see it working here

那发生了什么事?

  • 我们循环遍历known从0开始到9结尾(从第一个字符到最后一个字符)
  • 在每次迭代期间,i从0 - 9
  • 递增
  • last的值始终为9
  • last - i会以相反的顺序给我们索引(9,8,7,...,0)
  • 因此,当i为0时,last - i为9,known[9]为“h”;重复这个过程,你得到反向字符串

希望这有助于更好地解释当您在阵列上调用reverse()时发生的情况。

答案 4 :(得分:0)

(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()”而言。