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

标签 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)

      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

我的问题是下一个测试规范。一旦一根弦完全旋转,它就会向另一个方向旋转。

下面是测试规范:

it('once told to rotate fully will afterwards rotate in the other direction', () => {
    const rotate = rotater('helloWORLD');

    expect(rotate(1)).toEqual('elloWORLDh'); // same as before
    expect(rotate(2)).toEqual('lloWORLDhe'); // same as before

    rotate(10); // max value triggers rotation reversal

    expect(rotate(1)).toEqual('DhelloWORL');
    expect(rotate(2)).toEqual('LDhelloWOR');
    expect(rotate(6)).toEqual('oWORLDhell');

    rotate(10); // max value triggers rotation reversal

    expect(rotate(1)).toEqual('elloWORLDh');
    expect(rotate(2)).toEqual('lloWORLDhe');
    expect(rotate(6)).toEqual('ORLDhelloW');
  });

我对如何通过上述测试规范感到困惑。我需要在代码中插入 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()(它可以很好地处理负数)而不是像这样进行拆分和循环非常方便:

function rotater (str){
  let dir = 1
  return function (num){
    if (num == str.length) {
        dir *= -1
        return str
    }
    return str.slice(dir * num) + str.slice(0, dir * num)
  }
}

const rotate = rotater('helloWORLD');
console.log(rotate(1)) 

console.log(rotate(10)) 
console.log(rotate(1)) // now reversed DhelloWORL
console.log(rotate(6))

rotate(10)
console.log(rotate(1)) // back to forward elloWORLDh

关于JavaScript:完全旋转一个字符串,然后在给定数字输入的另​​一个方向上旋转该字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56432412/

相关文章:

javascript - 当其他服务更新服务的绑定(bind)属性时,为什么 $scope 不更新?

php - 全局 vs 函数 vs 静态类方法

iphone - 如何捕获当前 View 屏幕截图并在代码中重用? (iPhone SDK)

c++ - 如何使用 OpenCV 2.4.3 imRotate?

菜单项的 JavaScript 旋转在单击后卡住

javascript - 使用javascript读取Json文件数据?

javascript - 如何在更改值时获取数据列表中的 id 值?

javascript - 数字比较给出错误结果(javascript)

excel - 在excel VBA中获取范围函数

c++ - 如何在 C++ 中调用函数时打印每个函数名称?