2

我目前正在我的大学上介绍 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>
4

5 回答 5

10

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"
于 2013-05-17T23:37:06.190 回答
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)

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

于 2013-05-18T00:19:44.050 回答
1

您可以通过仅迭代一半的字符来完成此操作。

演示: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。然后简单地交换字符。

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


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

演示: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"
于 2013-05-18T00:54:31.040 回答
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];
}

你可以看到它在这里工作

那么发生了什么?

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

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

于 2013-05-18T00:28:41.840 回答
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()”。

于 2019-09-11T22:01:18.157 回答