How do you reverse a string in place in JavaScript?

前端 未结 30 2350
猫巷女王i
猫巷女王i 2020-11-22 00:29

How do you reverse a string in place (or in-place) in JavaScript when it is passed to a function with a return statement, without using built-in functions (.reverse()<

30条回答
  •  抹茶落季
    2020-11-22 00:44

    A small function that handles both combining diacritics and 2-byte characters:

    (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() ); }
    );
      


    Update

    A more complete list of combining diacritics is:

          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)
                || (0x17B4 <= 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);
          };
    
    

提交回复
热议问题