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

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

Ответы [ 44 ]

1 голос
/ 11 февраля 2015
var str = "my name is saurabh ";
var empStr='',finalString='';
var chunk=[];
function reverse(str){
var i,j=0,n=str.length;
    for(i=0;i<n;++i){
        if(str[i]===' '){
            chunk[j]=empStr;
            empStr = '';
            j++;
        }else{
            empStr=empStr+str[i];
        }
    }
    for(var z=chunk.length-1;z>=0;z--){
        finalString = finalString +' '+ chunk[z];
        console.log(finalString);
    }
    return true;
}
reverse(str);
1 голос
/ 21 августа 2014

Использование функций Array,

String.prototype.reverse = function(){
    return [].reduceRight.call(this, function(last, secLast){return last + secLast});
}
1 голос
/ 02 января 2014

Я думаю, что String.prototype.reverse - хороший способ решить эту проблему; код как ниже;

String.prototype.reverse = function() {
  return this.split('').reverse().join('');
}

var str = 'this is a good example for string reverse';
str.reverse();
-> "esrever gnirts rof elpmaxe doog a si siht";
1 голос
/ 28 октября 2013

без преобразования строки в массив;

String.prototype.reverse = function() {

    var ret = "";
    var size = 0;

    for (var i = this.length - 1; -1 < i; i -= size) {

        if (
          '\uD800' <= this[i - 1] && this[i - 1] <= '\uDBFF' && 
          '\uDC00' <= this[i]     && this[i]     <= '\uDFFF'
        ) {
            size = 2;
            ret += this[i - 1] + this[i];
        } else {
            size = 1;
            ret += this[i];
        }
    }

    return ret;
}

console.log('anãnam anañam' === 'mañana mañana'.reverse());

с использованием Array.reverse без преобразования символов в кодовые точки;

String.prototype.reverse = function() {

    var array = this.split("").reverse();

    for (var i = 0; i < this.length; ++i) {

        if (
          '\uD800' <= this[i - 1] && this[i - 1] <= '\uDBFF' && 
          '\uDC00' <= this[i]     && this[i]     <= '\uDFFF'
        ) {
            array[i - 1] = array[i - 1] + array[i];
            array[i] = array[i - 1].substr(0, 1);
            array[i - 1] = array[i - 1].substr(1, 1);
        }

    }

    return array.join("");
}

console.log('anãnam anañam' === 'mañana mañana'.reverse());
1 голос
/ 26 ноября 2015

Моя оригинальная попытка ...

var str = "The Car";

function reverseStr(str) {
  var reversed = "";
  var len = str.length;
  for (var i = 1; i < (len + 1); i++) {  
    reversed += str[len - i];      
  }

  return reversed;
}

var strReverse = reverseStr(str);    
console.log(strReverse);
// "raC ehT"

http://jsbin.com/bujiwo/19/edit?js,console,output

1 голос
/ 17 декабря 2018

Вот четыре наиболее распространенных метода, которые вы можете использовать для достижения обращения строки

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

Несколько решений проблемы

//reverse('apple') === 'leppa'
//reverse('hello') === 'olleh'
//reverse('Greetings!') === '!sgniteerG'

// 1. First method without using reverse function and negative for loop
function reverseFirst(str) {
    if(str !== '' || str !==undefined || str !== null) {
        const reversedStr = [];
        for(var i=str.length; i>-1; i--) {
        reversedStr.push(str[i]);
        }
    return reversedStr.join("").toString();
    }
}

// 2. Second method using the reverse function
function reverseSecond(str) {
    return str.split('').reverse().join('');
}

// 3. Third method using the positive for loop
function reverseThird(str){
    const reversedStr = [];
    for(i=0; i<str.length;i++) {
        reversedStr.push(str[str.length-1-i])
    }
    return reversedStr.join('').toString();
}

// 4. using the modified for loop ES6
function reverseForth(str) {
    const reversedStr = [];
    for(let character of str) {
        reversedStr = character + reversedStr;
    }
    return reversedStr;
}

// 5. Using Reduce function
function reverse(str) {
    return str.split('').reduce((reversed, character) => {
        return character + reversed;  
    }, '');
}
1 голос
/ 29 июня 2015

Лучшие способы перевернуть строку в JavaScript

1) Array.reverse:

Вы, наверное, думаете, подождите, я подумал, что мы переворачиваем строку, почему вы используете метод Array.reverse. Используя метод String.split, мы преобразуем нашу строку в массив символов. Затем мы меняем порядок каждого значения в массиве и, наконец, преобразуем массив обратно в строку, используя метод Array.join.

function reverseString(str) {
    return str.split('').reverse().join('');
}
reverseString('dwayne');

2) Уменьшение цикла while:

Хотя это довольно многословное решение, оно имеет свои преимущества перед первым решением. Вы не создаете массив и просто объединяете строку на основе символов из исходной строки.

С точки зрения производительности, это, вероятно, даст лучшие результаты (хотя и не проверено). Для очень длинных строк прирост производительности может выпасть из окна.

function reverseString(str) {
    var temp = '';
    var i = str.length;

    while (i > 0) {
        temp += str.substring(i - 1, i);
        i--;
    }


    return temp;
}
reverseString('dwayne');

3) Рекурсия

Мне нравится, как просто и понятно это решение. Вы можете ясно видеть, что методы String.charAt и String.substr используются для прохождения через другое значение, каждый раз вызывая себя, пока строка не станет пустой, из которой троичный будет просто возвращать пустую строку вместо использования рекурсии для вызова самой себя , Это, вероятно, даст вторую лучшую производительность после второго решения.

function reverseString(str) {
    return (str === '') ? '' : reverseString(str.substr(1)) + str.charAt(0);
}
reverseString('dwayne');
1 голос
/ 19 июля 2017

ОК, довольно просто, вы можете создать функцию с простым циклом, чтобы сделать для вас обратную строку без использования reverse(), charAt() и т. Д., Например:

Например, у вас есть эта строка:

var name = "StackOverflow";

Создайте такую ​​функцию, я ее называю reverseString ...

function reverseString(str) {
  if(!str.trim() || 'string' !== typeof str) {
    return;
  }
  let l=str.length, s='';
  while(l > 0) {
    l--;
    s+= str[l];
  }
  return s;
}

И вы можете назвать это как:

reverseString(name);

И результат будет:

"wolfrevOkcatS"
1 голос
/ 09 января 2017

Небольшая функция, которая обрабатывает как диакритические знаки, так и двухбайтовые символы:

(function(){
  var isCombiningDiacritic = function( code )
  {
    return (0x0300 <= code && code <= 0x036F)  // Comb. Diacritical Marks
        || (0x1AB0 <= code && code <= 0x1AFF)  // Comb. Diacritical Marks Extended
        || (0x1DC0 <= code && code <= 0x1DFF)  // Comb. Diacritical Marks Supplement
        || (0x20D0 <= code && code <= 0x20FF)  // Comb. Diacritical Marks for Symbols
        || (0xFE20 <= code && code <= 0xFE2F); // Comb. Half Marks

  };

  String.prototype.reverse = function()
  {
    var output = "",
        i      = this.length - 1,
        width;

    for ( ; i >= 0; --i )
    {
      width = 1;
      while( i > 0 && isCombiningDiacritic( this.charCodeAt(i) ) )
      {
        --i;
        width++;
      }

      if (
           i > 0
        && "\uDC00" <= this[i]   && this[i]   <= "\uDFFF"
        && "\uD800" <= this[i-1] && this[i-1] <= "\uDBFF"
      )
      {
        --i;
        width++;
      }

      output += this.substr( i, width );
    }

    return output;
  }
})();

// Tests
[
  'abcdefg',
  'ab\u0303c',
  'a\uD83C\uDFA5b',
  'a\uD83C\uDFA5b\uD83C\uDFA6c',
  'a\uD83C\uDFA5b\u0306c\uD83C\uDFA6d',
  'TO͇̹̺ͅƝ̴ȳ̳ TH̘Ë͖́̉ ͠P̯͍̭O̚​N̐Y̡' // copied from http://stackoverflow.com/a/1732454/1509264
].forEach(
  function(str){ console.log( str + " -> " + str.reverse() ); }
);
  
1 голос
/ 08 июля 2017

Держите это СУХОЙ и просто глупо !!

function reverse(s){
let str = s;
var reverse = '';
for (var i=str.length;i>0;i--){

    var newstr = str.substring(0,i)
    reverse += newstr.substr(-1,1)
}
return reverse;
}
...