JavaScript: полностью повернуть строку, а затем повернуть строку в другом направлении с учетом ввода числа - PullRequest
1 голос
/ 03 июня 2019

У меня есть функция, которая принимает строку и возвращает функцию.Возвращаемая функция принимает число и возвращает строку.Возвращенная функция возвращает исходную строку, повернутую на заданное число.

Мой код ниже работает.

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 плюс разрыв в моем коде?Пожалуйста, дайте мне, какой код отсутствует для прохождения вышеупомянутой спецификации.

1 Ответ

1 голос
/ 03 июня 2019

Вам нужен способ установить состояние возвращаемой функции.Один из способов сделать это - включить значение, которое вы фиксируете, в замыкание, которое указывает направление.Затем вы можете манипулировать в функции.Например:

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
...