Как вы переворачиваете строку в JavaScript? - PullRequest
393 голосов
/ 06 июня 2009

Как вы переворачиваете строку на месте (или на месте) в JavaScript при передаче функции с оператором return? Все без использования встроенных функций? .reverse(), .charAt() и т. Д.

Ответы [ 44 ]

7 голосов
/ 08 августа 2018

Есть несколько способов сделать это, вы можете проверить следующее,

1. Традиционный для цикла (инкремент):

function reverseString(str){
        let stringRev ="";
        for(let i= 0; i<str.length; i++){
            stringRev = str[i]+stringRev;
        }
        return stringRev;
}
alert(reverseString("Hello World!"));

2. Традиционный для цикла (убывающий):

function reverseString(str){
    let revstr = "";
    for(let i = str.length-1; i>=0; i--){
        revstr = revstr+ str[i];
    }
    return revstr;
}
alert(reverseString("Hello World!"));

3. Использование for-of loop

function reverseString(str){
    let strn ="";
    for(let char of str){
        strn = char + strn;
    }
    return strn;
}
alert(reverseString("Get well soon"));

4. Использование метода массива forEach / high order:

function reverseString(str){

  let revSrring = "";
  str.split("").forEach(function(char){
    
    revSrring = char + revSrring;
  
  });
  return revSrring;
}
alert(reverseString("Learning JavaScript"));

5. Стандарт ES6:

function reverseString(str){

  let revSrring = "";
  str.split("").forEach(char => revSrring = char + revSrring);
  return revSrring;
}
alert(reverseString("Learning JavaScript"));

6. Последний способ:

function reverseString(str){

  return str.split("").reduce(function(revString, char){
       return char + revString;
  }, "");
 
}

alert(reverseString("Learning JavaScript"));

7. Вы также можете получить результат, используя следующее:

function reverseString(str){

  return str.split("").reduce((revString, char)=> char + revString, "");
 
}
alert(reverseString("Learning JavaScript"));
6 голосов
/ 04 июля 2015
var str = 'sample string';
[].map.call(str, function(x) {
  return x;
}).reverse().join('');

OR

var str = 'sample string';
console.log(str.split('').reverse().join(''));

// Вывод: 'gnirts elpmas'

6 голосов
/ 09 августа 2011

Я думаю, это самый простой способ

var reverse = function(str) {
    var arr = [];
    
    for (var i = 0, len = str.length; i <= len; i++) {
        arr.push(str.charAt(len - i))
    }

    return arr.join('');
}

console.log(reverse('I want a ?'));
5 голосов
/ 15 января 2018

В ES6 у вас есть еще одна опция

function reverseString (str) {
  return [...str].reverse().join('')
}

reverseString('Hello');
5 голосов
/ 29 июня 2013

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

function StringReverse (str)
{
  var charArray = [];
  for (var i = 0; i < str.length; i++)
    {
      if (i+1 < str.length)
        {
          var value = str.charCodeAt(i);
          var nextValue = str.charCodeAt(i+1);
          if (   (   value >= 0xD800 && value <= 0xDBFF
                  && (nextValue & 0xFC00) == 0xDC00) // Surrogate pair)
              || (nextValue >= 0x0300 && nextValue <= 0x036F)) // Combining marks
            {
              charArray.unshift(str.substring(i, i+2));
              i++; // Skip the other half
              continue;
            }
        }

      // Otherwise we just have a rogue surrogate marker or a plain old character.
      charArray.unshift(str[i]);
    }

  return charArray.join('');
}

Все сведения о Матиасе, Punycode и других справочных материалах, рассказывающих о сложности кодирования символов в JavaScript.

2 голосов
/ 11 мая 2016

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

function reverseString(str) {

  var strArray = str.split("");
  strArray.reverse();

  var strReverse = strArray.join("");

  return strReverse;
}

reverseString("hello");
2 голосов
/ 01 мая 2017
//es6
//array.from
const reverseString = (string) => Array.from(string).reduce((a, e) => e + a);
//split
const reverseString = (string) => string.split('').reduce((a, e) => e + a); 

//split problem
"??".split('')[0] === Array.from("??")[0] // "�" === "?" => false
"???".split('')[0] === Array.from("???")[0] // "�" === "?" => false
2 голосов
/ 21 сентября 2017

Если вы не хотите использовать какую-либо встроенную функцию. Попробуйте это

        var string = 'abcdefg';
        var newstring = '';

        for(let i = 0; i < string.length; i++){
            newstring = string[i] += newstring
        }

        console.log(newstring)
2 голосов
/ 23 июня 2013

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

Так же, как упражнение для игры с рекурсией: иногда, когда вы идете на собеседование, интервьюер может спросить вас, как сделать это с помощью рекурсии, и я думаю, что «предпочтительным ответом» может быть «Я бы предпочел не делать этого в рекурсия, поскольку это может легко вызвать переполнение стека "(потому что это O(n), а не O(log n). Если это O(log n), переполнение стека довольно трудно - стек может обрабатывать 4 миллиарда элементов уровень 32, так как 2 ** 32 - 4294967296. Но если это O(n), то он может легко получить переполнение стека.

Иногда интервьюер все равно спрашивает вас: «Как упражнение, почему бы вам не написать его с помощью рекурсии?» И вот оно:

String.prototype.reverse = function() {
    if (this.length <= 1) return this;
    else return this.slice(1).reverse() + this.slice(0,1);
}

тестовый прогон:

var s = "";
for(var i = 0; i < 1000; i++) {
    s += ("apple" + i);
}
console.log(s.reverse());

выход:

999elppa899elppa...2elppa1elppa0elppa

Чтобы попытаться получить переполнение стека, я изменил 1000 на 10000 в Google Chrome, и он сообщил:

RangeError: Maximum call stack size exceeded
1 голос
/ 06 июня 2009
function reverseString(string) {
    var reversedString = "";
    var stringLength = string.length - 1;
    for (var i = stringLength; i >= 0; i--) {
        reversedString += string[i];
    }
    return reversedString;
}
...