JavaScript:完全旋转字符串,然后在给定数字输入的另一个方向上旋转字符串

JavaScript:完全旋转字符串,然后在给定数字输入的另一个方向上旋转字符串,javascript,function,rotation,return,reverse,Javascript,Function,Rotation,Return,Reverse,我有一个函数,它接受一个字符串并返回一个函数。返回的函数接受一个数字并返回一个字符串。返回的函数返回按给定数字旋转的原始字符串 我下面的代码可以工作 function rotater (str){ return function (num){ let strArr = str.split(''); //console.log(strArr) for (let i=0; i<num; i++){ //console.log(num)

我有一个函数,它接受一个字符串并返回一个函数。返回的函数接受一个数字并返回一个字符串。返回的函数返回按给定数字旋转的原始字符串

我下面的代码可以工作

function rotater (str){
  return function (num){

    let strArr = str.split('');
    //console.log(strArr)

    for (let i=0; i<num; i++){
      //console.log(num)

      let element = strArr[0];
      //console.log(element)

      strArr.push(element); 
      strArr.shift()
      //console.log(strArr)
    }
    return strArr.join('')
  }
}

const rotate = rotater('abcde');
rotate(4) // returns 'eabcd' as expected

我对如何通过上述测试规范感到困惑。我是否需要在代码中插入if语句和break?请告诉我缺少什么代码才能通过上述规范。

您需要一种方法来设置返回函数的状态。一种方法是在指示方向的闭包中包含捕获的值。然后可以在函数中进行操作。例如:

function rotater (str){
  let dir = 1                  // flag captured in closure
  return function (num){
    if (num == str.length) {
        dir *= -1              // manipulate it where appropriate 
    }
我将标志设置为正数或负数1,因为这样使用
slice()
(它可以很好地处理负数),而不是像这样拆分和循环:

函数旋转器(str){
设dir=1
返回函数(num){
如果(num==str.length){
dir*=-1
返回str
}
返回str.slice(dir*num)+str.slice(0,dir*num)
}
}
const rotate=rotater('helloWORLD');
控制台日志(旋转(1))
控制台日志(旋转(10))
console.log(rotate(1))//现在反转了DhelloWORL
控制台日志(旋转(6))
轮换(10)

console.log(rotate(1))//返回到forward elloWORLDh
后续问题:当代码命中console.log(rotate(1))的第二个实例时,它如何知道需要反转?或者换句话说,旋转(10)是如何迫使它反转的?当第二次调用dir时,变量dir是-1。闭包是在函数中保存状态的一种方法。当您调用
rotate(10)
时,如果(num==str.length)块和
dir
1
更改为
-1
,请阅读和@PineNuts0。这会在切片中使用
dir
,导致切片中出现正值或负值。哦,等等,它会将全局dir设置为-1;因此随后的调用使用-1;然后当你再次点击旋转(10),你乘以-1*-1=1;现在1是新的全局方向。。。我的理解正确吗?是的@PineNuts0是正确的,除了
dir
不是全局的。它是
rotater
函数的局部函数,由于闭包,返回的函数能够看到并操作该函数。(出于同样的原因,返回的函数能够看到
str
)。
function rotater (str){
  let dir = 1                  // flag captured in closure
  return function (num){
    if (num == str.length) {
        dir *= -1              // manipulate it where appropriate 
    }