猿问

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

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


我下面的代码有效。


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 吗?请让我通过上述规范缺少什么代码。


凤凰求蛊
浏览 119回答 1
1回答

阿波罗的战车

您需要一种方法来设置返回函数的状态。一种方法是将您捕获的值包含在指示方向的闭包中。然后您可以在函数中进行操作。例如:function rotater (str){&nbsp; let dir = 1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // flag captured in closure&nbsp; return function (num){&nbsp; &nbsp; if (num == str.length) {&nbsp; &nbsp; &nbsp; &nbsp; dir *= -1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // manipulate it where appropriate&nbsp;&nbsp; &nbsp; }我将标志设置为正数或负数 1,因为这样使用起来非常方便slice()(可以很好地处理负数),而不是使用以下内容进行拆分和循环:function rotater (str){&nbsp; let dir = 1&nbsp; return function (num){&nbsp; &nbsp; if (num == str.length) {&nbsp; &nbsp; &nbsp; &nbsp; dir *= -1&nbsp; &nbsp; &nbsp; &nbsp; return str&nbsp; &nbsp; }&nbsp; &nbsp; return str.slice(dir * num) + str.slice(0, dir * num)&nbsp; }}const rotate = rotater('helloWORLD');console.log(rotate(1))&nbsp;console.log(rotate(10))&nbsp;console.log(rotate(1)) // now reversed DhelloWORLconsole.log(rotate(6))rotate(10)console.log(rotate(1)) // back to forward elloWORLDh
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答