我有一个函数,它接受一个字符串并返回一个函数。返回的函数接受一个数字并返回一个字符串。返回的函数返回按给定数字旋转的原始字符串。
我下面的代码有效。
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/