599 Stimmen

Wie kehrt man in JavaScript eine Zeichenkette an Ort und Stelle um?

Wie kehrt man eine Zeichenkette in JavaScript an Ort und Stelle um, wenn sie an eine Funktion mit einer Rückgabeanweisung übergeben wird, ohne integrierte Funktionen zu verwenden ( .reverse() , .charAt() usw.)?

0 Stimmen

Sie dürfen also nicht .charAt() verwenden, um die Zeichen der Zeichenkette zu erhalten?

192 Stimmen

Das können Sie nicht. JavaScript-Zeichenfolgen sind unveränderlich, was bedeutet, dass der Speicher, der ihnen zugewiesen ist, nicht beschrieben werden kann, was echte "In-Place"-Umkehrungen unmöglich macht.

3 Stimmen

Re: crescentfresh's Kommentar siehe stackoverflow.com/questions/51185/

3voto

MT0 Punkte 108686

UTF-8-Strings können haben:

  • Kombinationen von diakritischen Zeichen wie b die sich aus dem b Zeichen und eine Anhängerschaft ~ Diakritisches Zeichen, das durch die Unicode-Escape-Sequenz erzeugt wird \u0303 ;
  • Multi-Byte-Zeichen wie z.B. die durch die Multi-Byte-Unicode-Escape-Sequenz erzeugt wird \uD83C\uDFA5 und
  • Mehrere Zeichen können mit einem Null-Breiten-Verbindungszeichen kombiniert werden (durch die Unicode-Escape-Sequenz \u200D ). Zum Beispiel kann das Zeichen kann aus den einzelnen (Multi-Byte-)Emojis zusammengesetzt werden, dann aus einem Null-Breiten-Joiner, dann aus einem weiteren Null-Breiten-Joiner, so dass das gesamte 3-Personen-Zeichen aus 8 Bytes besteht ( \uD83D\uDC68\u200D\uD83D\uDC69\u200D\uD83D\uDC66 ).

Dadurch werden alle 3 Fälle umgekehrt und die Bytes in der richtigen Reihenfolge gehalten, so dass die Zeichen umgekehrt werden (anstatt die Bytes der Zeichenkette naiv umzukehren):

(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()
  {
    let output = "";

    for ( let i = this.length; i > 0; )
    {
      let width = 0;
      let has_zero_width_joiner = false;

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

      do {
        --i;
        width++;

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

      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 THE PONY', // copied from http://stackoverflow.com/a/1732454/1509264
  'What  is this?'
].forEach(
  function(str){ console.log( str + " -> " + str.reverse() ); }
);

Update

Der obige Code enthält einige der am häufigsten verwendeten kombinierten diakritischen Zeichen. Eine vollständigere Liste von kombinierenden diakritischen Zeichen (die in den obigen Code eingefügt werden können) ist:

var isCombiningDiacritic = function( code )
{
  return (0x0300 <= code && code <= 0x036F)
      || (0x0483 <= code && code <= 0x0489)
      || (0x0591 <= code && code <= 0x05BD)
      || (code == 0x05BF)
      || (0x05C1 <= code && code <= 0x05C2)
      || (0x05C4 <= code && code <= 0x05C5)
      || (code == 0x05C7)
      || (0x0610 <= code && code <= 0x061A)
      || (0x064B <= code && code <= 0x065F)
      || (code == 0x0670)
      || (0x06D6 <= code && code <= 0x06DC)
      || (0x06DF <= code && code <= 0x06E4)
      || (0x06E7 <= code && code <= 0x06E8)
      || (0x06EA <= code && code <= 0x06ED)
      || (code == 0x0711)
      || (0x0730 <= code && code <= 0x074A)
      || (0x07A6 <= code && code <= 0x07B0)
      || (0x07EB <= code && code <= 0x07F3)
      || (code == 0x07FD)
      || (0x0816 <= code && code <= 0x0819)
      || (0x081B <= code && code <= 0x0823)
      || (0x0825 <= code && code <= 0x0827)
      || (0x0829 <= code && code <= 0x082D)
      || (0x0859 <= code && code <= 0x085B)
      || (0x08D3 <= code && code <= 0x08E1)
      || (0x08E3 <= code && code <= 0x0902)
      || (code == 0x093A)
      || (code == 0x093C)
      || (0x0941 <= code && code <= 0x0948)
      || (code == 0x094D)
      || (0x0951 <= code && code <= 0x0957)
      || (0x0962 <= code && code <= 0x0963)
      || (code == 0x0981)
      || (code == 0x09BC)
      || (0x09C1 <= code && code <= 0x09C4)
      || (code == 0x09CD)
      || (0x09E2 <= code && code <= 0x09E3)
      || (0x09FE <= code && code <= 0x0A02)
      || (code == 0x0A3C)
      || (0x0A41 <= code && code <= 0x0A51)
      || (0x0A70 <= code && code <= 0x0A71)
      || (code == 0x0A75)
      || (0x0A81 <= code && code <= 0x0A82)
      || (code == 0x0ABC)
      || (0x0AC1 <= code && code <= 0x0AC8)
      || (code == 0x0ACD)
      || (0x0AE2 <= code && code <= 0x0AE3)
      || (0x0AFA <= code && code <= 0x0B01)
      || (code == 0x0B3C)
      || (code == 0x0B3F)
      || (0x0B41 <= code && code <= 0x0B44)
      || (0x0B4D <= code && code <= 0x0B56)
      || (0x0B62 <= code && code <= 0x0B63)
      || (code == 0x0B82)
      || (code == 0x0BC0)
      || (code == 0x0BCD)
      || (code == 0x0C00)
      || (code == 0x0C04)
      || (0x0C3E <= code && code <= 0x0C40)
      || (0x0C46 <= code && code <= 0x0C56)
      || (0x0C62 <= code && code <= 0x0C63)
      || (code == 0x0C81)
      || (code == 0x0CBC)
      || (0x0CCC <= code && code <= 0x0CCD)
      || (0x0CE2 <= code && code <= 0x0CE3)
      || (0x0D00 <= code && code <= 0x0D01)
      || (0x0D3B <= code && code <= 0x0D3C)
      || (0x0D41 <= code && code <= 0x0D44)
      || (code == 0x0D4D)
      || (0x0D62 <= code && code <= 0x0D63)
      || (code == 0x0DCA)
      || (0x0DD2 <= code && code <= 0x0DD6)
      || (code == 0x0E31)
      || (0x0E34 <= code && code <= 0x0E3A)
      || (0x0E47 <= code && code <= 0x0E4E)
      || (code == 0x0EB1)
      || (0x0EB4 <= code && code <= 0x0EBC)
      || (0x0EC8 <= code && code <= 0x0ECD)
      || (0x0F18 <= code && code <= 0x0F19)
      || (code == 0x0F35)
      || (code == 0x0F37)
      || (code == 0x0F39)
      || (0x0F71 <= code && code <= 0x0F7E)
      || (0x0F80 <= code && code <= 0x0F84)
      || (0x0F86 <= code && code <= 0x0F87)
      || (0x0F8D <= code && code <= 0x0FBC)
      || (code == 0x0FC6)
      || (0x102D <= code && code <= 0x1030)
      || (0x1032 <= code && code <= 0x1037)
      || (0x1039 <= code && code <= 0x103A)
      || (0x103D <= code && code <= 0x103E)
      || (0x1058 <= code && code <= 0x1059)
      || (0x105E <= code && code <= 0x1060)
      || (0x1071 <= code && code <= 0x1074)
      || (code == 0x1082)
      || (0x1085 <= code && code <= 0x1086)
      || (code == 0x108D)
      || (code == 0x109D)
      || (0x135D <= code && code <= 0x135F)
      || (0x1712 <= code && code <= 0x1714)
      || (0x1732 <= code && code <= 0x1734)
      || (0x1752 <= code && code <= 0x1753)
      || (0x1772 <= code && code <= 0x1773)
      || (x17B4 <= code && code <= 0x17B5)
      || (0x17B7 <= code && code <= 0x17BD)
      || (code == 0x17C6)
      || (0x17C9 <= code && code <= 0x17D3)
      || (code == 0x17DD)
      || (0x180B <= code && code <= 0x180D)
      || (0x1885 <= code && code <= 0x1886)
      || (code == 0x18A9)
      || (0x1920 <= code && code <= 0x1922)
      || (0x1927 <= code && code <= 0x1928)
      || (code == 0x1932)
      || (0x1939 <= code && code <= 0x193B)
      || (0x1A17 <= code && code <= 0x1A18)
      || (code == 0x1A1B)
      || (code == 0x1A56)
      || (0x1A58 <= code && code <= 0x1A60)
      || (code == 0x1A62)
      || (0x1A65 <= code && code <= 0x1A6C)
      || (0x1A73 <= code && code <= 0x1A7F)
      || (0x1AB0 <= code && code <= 0x1B03)
      || (code == 0x1B34)
      || (0x1B36 <= code && code <= 0x1B3A)
      || (code == 0x1B3C)
      || (code == 0x1B42)
      || (0x1B6B <= code && code <= 0x1B73)
      || (0x1B80 <= code && code <= 0x1B81)
      || (0x1BA2 <= code && code <= 0x1BA5)
      || (0x1BA8 <= code && code <= 0x1BA9)
      || (0x1BAB <= code && code <= 0x1BAD)
      || (code == 0x1BE6)
      || (0x1BE8 <= code && code <= 0x1BE9)
      || (code == 0x1BED)
      || (0x1BEF <= code && code <= 0x1BF1)
      || (0x1C2C <= code && code <= 0x1C33)
      || (0x1C36 <= code && code <= 0x1C37)
      || (0x1CD0 <= code && code <= 0x1CD2)
      || (0x1CD4 <= code && code <= 0x1CE0)
      || (0x1CE2 <= code && code <= 0x1CE8)
      || (code == 0x1CED)
      || (code == 0x1CF4)
      || (0x1CF8 <= code && code <= 0x1CF9)
      || (0x1DC0 <= code && code <= 0x1DFF)
      || (0x20D0 <= code && code <= 0x20F0)
      || (0x2CEF <= code && code <= 0x2CF1)
      || (code == 0x2D7F)
      || (0x2DE0 <= code && code <= 0x2DFF)
      || (0x302A <= code && code <= 0x302D)
      || (0x3099 <= code && code <= 0x309A)
      || (0xA66F <= code && code <= 0xA672)
      || (0xA674 <= code && code <= 0xA67D)
      || (0xA69E <= code && code <= 0xA69F)
      || (0xA6F0 <= code && code <= 0xA6F1)
      || (code == 0xA802)
      || (code == 0xA806)
      || (code == 0xA80B)
      || (0xA825 <= code && code <= 0xA826)
      || (0xA8C4 <= code && code <= 0xA8C5)
      || (0xA8E0 <= code && code <= 0xA8F1)
      || (code == 0xA8FF)
      || (0xA926 <= code && code <= 0xA92D)
      || (0xA947 <= code && code <= 0xA951)
      || (0xA980 <= code && code <= 0xA982)
      || (code == 0xA9B3)
      || (0xA9B6 <= code && code <= 0xA9B9)
      || (0xA9BC <= code && code <= 0xA9BD)
      || (code == 0xA9E5)
      || (0xAA29 <= code && code <= 0xAA2E)
      || (0xAA31 <= code && code <= 0xAA32)
      || (0xAA35 <= code && code <= 0xAA36)
      || (code == 0xAA43)
      || (code == 0xAA4C)
      || (code == 0xAA7C)
      || (code == 0xAAB0)
      || (0xAAB2 <= code && code <= 0xAAB4)
      || (0xAAB7 <= code && code <= 0xAAB8)
      || (0xAABE <= code && code <= 0xAABF)
      || (code == 0xAAC1)
      || (0xAAEC <= code && code <= 0xAAED)
      || (code == 0xAAF6)
      || (code == 0xABE5)
      || (code == 0xABE8)
      || (code == 0xABED)
      || (code == 0xFB1E)
      || (0xFE00 <= code && code <= 0xFE0F)
      || (0xFE20 <= code && code <= 0xFE2F)
      || (code == 0x101FD)
      || (code == 0x102E0)
      || (0x10376 <= code && code <= 0x1037A)
      || (0x10A01 <= code && code <= 0x10A0F)
      || (0x10A38 <= code && code <= 0x10A3F)
      || (0x10AE5 <= code && code <= 0x10AE6)
      || (0x10D24 <= code && code <= 0x10D27)
      || (0x10F46 <= code && code <= 0x10F50)
      || (code == 0x11001)
      || (0x11038 <= code && code <= 0x11046)
      || (0x1107F <= code && code <= 0x11081)
      || (0x110B3 <= code && code <= 0x110B6)
      || (0x110B9 <= code && code <= 0x110BA)
      || (0x11100 <= code && code <= 0x11102)
      || (0x11127 <= code && code <= 0x1112B)
      || (0x1112D <= code && code <= 0x11134)
      || (code == 0x11173)
      || (0x11180 <= code && code <= 0x11181)
      || (0x111B6 <= code && code <= 0x111BE)
      || (0x111C9 <= code && code <= 0x111CC)
      || (0x1122F <= code && code <= 0x11231)
      || (code == 0x11234)
      || (0x11236 <= code && code <= 0x11237)
      || (code == 0x1123E)
      || (code == 0x112DF)
      || (0x112E3 <= code && code <= 0x112EA)
      || (0x11300 <= code && code <= 0x11301)
      || (0x1133B <= code && code <= 0x1133C)
      || (code == 0x11340)
      || (0x11366 <= code && code <= 0x11374)
      || (0x11438 <= code && code <= 0x1143F)
      || (0x11442 <= code && code <= 0x11444)
      || (code == 0x11446)
      || (code == 0x1145E)
      || (0x114B3 <= code && code <= 0x114B8)
      || (code == 0x114BA)
      || (0x114BF <= code && code <= 0x114C0)
      || (0x114C2 <= code && code <= 0x114C3)
      || (0x115B2 <= code && code <= 0x115B5)
      || (0x115BC <= code && code <= 0x115BD)
      || (0x115BF <= code && code <= 0x115C0)
      || (0x115DC <= code && code <= 0x115DD)
      || (0x11633 <= code && code <= 0x1163A)
      || (code == 0x1163D)
      || (0x1163F <= code && code <= 0x11640)
      || (code == 0x116AB)
      || (code == 0x116AD)
      || (0x116B0 <= code && code <= 0x116B5)
      || (code == 0x116B7)
      || (0x1171D <= code && code <= 0x1171F)
      || (0x11722 <= code && code <= 0x11725)
      || (0x11727 <= code && code <= 0x1172B)
      || (0x1182F <= code && code <= 0x11837)
      || (0x11839 <= code && code <= 0x1183A)
      || (0x119D4 <= code && code <= 0x119DB)
      || (code == 0x119E0)
      || (0x11A01 <= code && code <= 0x11A06)
      || (0x11A09 <= code && code <= 0x11A0A)
      || (0x11A33 <= code && code <= 0x11A38)
      || (0x11A3B <= code && code <= 0x11A3E)
      || (code == 0x11A47)
      || (0x11A51 <= code && code <= 0x11A56)
      || (0x11A59 <= code && code <= 0x11A5B)
      || (0x11A8A <= code && code <= 0x11A96)
      || (0x11A98 <= code && code <= 0x11A99)
      || (0x11C30 <= code && code <= 0x11C3D)
      || (0x11C92 <= code && code <= 0x11CA7)
      || (0x11CAA <= code && code <= 0x11CB0)
      || (0x11CB2 <= code && code <= 0x11CB3)
      || (0x11CB5 <= code && code <= 0x11CB6)
      || (0x11D31 <= code && code <= 0x11D45)
      || (code == 0x11D47)
      || (0x11D90 <= code && code <= 0x11D91)
      || (code == 0x11D95)
      || (code == 0x11D97)
      || (0x11EF3 <= code && code <= 0x11EF4)
      || (0x16AF0 <= code && code <= 0x16AF4)
      || (0x16B30 <= code && code <= 0x16B36)
      || (code == 0x16F4F)
      || (0x16F8F <= code && code <= 0x16F92)
      || (0x1BC9D <= code && code <= 0x1BC9E)
      || (0x1D167 <= code && code <= 0x1D169)
      || (0x1D17B <= code && code <= 0x1D182)
      || (0x1D185 <= code && code <= 0x1D18B)
      || (0x1D1AA <= code && code <= 0x1D1AD)
      || (0x1D242 <= code && code <= 0x1D244)
      || (0x1DA00 <= code && code <= 0x1DA36)
      || (0x1DA3B <= code && code <= 0x1DA6C)
      || (code == 0x1DA75)
      || (code == 0x1DA84)
      || (0x1DA9B <= code && code <= 0x1E02A)
      || (0x1E130 <= code && code <= 0x1E136)
      || (0x1E2EC <= code && code <= 0x1E2EF)
      || (0x1E8D0 <= code && code <= 0x1E8D6)
      || (0x1E944 <= code && code <= 0x1E94A)
      || (0xE0100 <= code && code <= 0xE01EF);
};

2voto

function reverseString(string) {
    var reversedString = "";
    var stringLength = string.length - 1;
    for (var i = stringLength; i >= 0; i--) {
        reversedString += string[i];
    }
    return reversedString;
}

2voto

Dzenis H. Punkte 5945

Umkehrung einer Zeichenkette mit integrierten Funktionen

function reverse(str) {
  // Use the split() method to return a new array
  //  Use the reverse() method to reverse the new created array
  // Use the join() method to join all elements of the array into a string
  return str.split("").reverse().join("");
}
console.log(reverse('hello'));

Umkehrung einer Zeichenkette ohne die Hilfsmittel

function reversedOf(str) {
  let newStr = '';
  for (let char of str) {
    newStr = char + newStr
    // 1st round: "h" + "" = h, 2nd round: "e" + "h" = "eh" ... etc. 
    // console.log(newStr);
  }
  return newStr;
}
console.log(reversedOf('hello'));

2voto

Ramsy de Vos Punkte 902

Strings selbst sind unveränderlich, aber Sie können mit dem folgenden Code leicht eine umgekehrte Kopie erstellen:

function reverseString(str) {

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

  var strReverse = strArray.join("");

  return strReverse;
}

reverseString("hello");

2voto

alejandro Punkte 2725
//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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X