Как перевернуть строку JavaScript без встроенной функции ..? - PullRequest
0 голосов
/ 16 сентября 2018

Я хочу перевернуть строку без встроенной функции, например split , reverse и join , я должен попробовать код здесь https://stackoverflow.com/a/51751393/8070090, но я не совсем понимаю, что код делает в четвертой строке, мне нужно больше объяснений в четвертой строке. Это мой код с некоторыми пояснениями

 function reverseString(str) {
  reverseIt = [];
  for (i = 0; i < str.length; i++) {
    reverseIt = str[i] + reverseIt; // the first way that works
    // reverseIt = str[i] + [];    // first.. i assume the variable "reverseIt" is equal to "[]", but the result from this line is not equal to the line above
    // reverseIt = str[i] + '';    // then i try this way with assume the variable reverseIt is empty string (""), but the result from this line not produce the expected result

    // var testing = [];             // and then  i try to make an empty array variable again
    // reverseIt = str[i] + testing; // and try to add the variable above, but this still not realy produce the expected result
    /*
      So the questions.., why the first way can works..?, what's actualy the code on that line do..?
    */
  }
  return reverseIt;
}
console.log(reverseString('Javascript'));

Ответы [ 4 ]

0 голосов
/ 16 сентября 2018

Строка

reverseIt = str[i] + reverseIt;

может стать более понятной, если подумать о том, как выглядит временный результат выполнения тела цикла для индексов начала, промежуточного и конечного значений:

1.Start (i = 0)

reverseIt === str[0] + reverseIt === str[0] + []

Здесь есть тонкая, но важная деталь: + тихо приведет тип [] в строку, то есть [] будет преобразован в ''.

2.Промежуточное (0 reverseIt === str[i] + reversetIt === str[i] + (str[i - 1] + ... + str[0] + []) 3.Конец (i = n - 1):

reverseIt === str[n - 1] + reversetIt === str[n - 1] + (str[n - 2] + ... + str[0] + []) === str + []

В двух неработающих строках вы отбрасываете накопленный результат.Таким образом, для каждого индекса

reverseIt === str[i] + [] 

соответственно

reverseIt === str[i] + ''

Это означает, что вы всегда будете иметь строку, содержащую только последний символ в исходной строке (или пустую строку).


В sidenote, с комбинацией Array.from и Array.reduce вы можете получить результат в одной строке:

const reverse = (s) => Array.from(s).reduce((result, c) => `${c}${result}`, '');

console.log(reverse('JavaScript'));
0 голосов
/ 16 сентября 2018

Если вы еще не знали, в основном, строка - это массив символов.Вы можете циклически проходить строку так же, как вы делаете это с массивами, и на каждой итерации вы получите один символ этой строки.

function reverseString(str) {
    var data="HELLO WORLD!";  // Test string
    var reverseIt ="";  // variable to save reversed string
    for(var i=data.length-1;i>=0;i--) // start the loop from last character and run it towards the first character
    {
        reverseIt +=data[i] // append current character to reverse variable
    }
    document.write(reverseIt ); // print reverse
return reverseIt;
}
0 голосов
/ 16 сентября 2018

Javascript преобразует массивы в строки, оператор "+" описан здесь , поэтому я бы предложил использовать пустую строку для reverseIt.reverseIt = ""; В четвертой строке поясняется:

  • вы соединяете первый символ из исходной строки с этой пустой (на данный момент) строкой, reverseIt
  • При следующей итерации reverseIt будет содержать первый символ исходной строки, и вы объедините его со вторым символом из исходной строки.
  • Теперь reverseIt должен выглядеть следующим образом: str[1] + str[0].
  • Следующая итерация добавляет третий символ str к существующему reverseIt, который будет выглядеть как str[2] + str[1] + str[0].
  • Обратите внимание, что символ из исходной строки добавляется перед reverseItстрока, str[i] + reverseIt, поэтому символы в конце str будут символами перед reverseIt.
  • Надеюсь, мое объяснение понятно.
0 голосов
/ 16 сентября 2018

Буквально оно говорит, что начинается с первого символа до конца, и на каждом шаге добавляйте новый символ перед всей созданной строкой

Так, например, для имени david, оно начинается спустая строка, затем переводит каждую букву в начало серии.начиная с нуля, затем d, затем добавляет a к началу, что составляет ad, затем добавляется v, чтобы стать vad, и так далее до divad

-> То, что вы пробовали с этим кодом:

reverseIt = str[i] + [];

отличается от исходного кода.Потому что reverseIt это [] только в начале !(Просто обратите внимание, что это [] здесь равно '', потому что в данном случае строка является просто массивом строк! Так что это содержит оба случая.)

Это [] (или '', здесь нет никакой разницы) сначала действительно, но, переходя на один уровень, он становится d!затем новый str[i] равен a, который затем объединяется в reverseIt, который теперь равен d, и затем результат становится ad, который будет помещен в reverseIt!поэтому в конце этого шага переменная reverseIt равна ad, а не []!и так будет продолжаться до тех пор, пока вся строка не будет перевернута.

-> То, что вы пробовали с этим кодом:

var testing = [];
reverseIt = str[i] + testing;

неверно, потому что вы буквально сбрасываете свою перевернутую строку в каждомшаг, и вы не соединяете новую строку с уже созданной строкой, а скорее устанавливаете ее только для самого последнего символа.поэтому сначала reverseIt равно [], затем становится d, затем становится a, затем становится v и т. д., поскольку на каждом шаге оно равняется str[i] + testing, и потому чтоtesting всегда [], буквально это выглядит так: reverseIt = str[i], поэтому в конце он содержит только последний символ строки!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...