×

Welcome to TagMyCode

Please login or create account to add a snippet.
0
0
 
1
Language: Javascript
Posted by: Isaac Dettman
Added: Nov 26, 2016 6:24 PM
Modified: Apr 25, 2017 1:02 AM
Views: 6
  1. function NaturalSort( string_array )  // string_array - это массив со строками (!), не числами.
  2. {
  3.     var splitters = string_array.map( makeSplitter ),
  4.         sorted = splitters.sort( compareSplitters );
  5.     return sorted.map( function( splitter ){
  6.     return splitter.item });  
  7.    
  8.     function makeSplitter( item ){
  9.       return new Splitter( item ) }
  10.      
  11.     function Splitter( item ){
  12.       var index = 0, from = 0, parts = [], completed = false;
  13.       this.item = item;  var key = item; this.key = key;
  14.       this.count = function(){
  15.         return parts.length; };
  16.         this.part = function( i ){
  17.           while ( parts.length <= i && !completed ) next();
  18.                                return i < parts.length ? parts[ i ] : null;
  19.                              };
  20.       function next(){
  21.         if ( index < key.length ){
  22.           while ( ++index ){
  23.             var currentIsDigit = isDigit( key.charAt( index - 1 ) ),
  24.                 nextChar = key.charAt( index ),
  25.                 currentIsLast = index === key.length,
  26.                 isBorder = currentIsLast || xor(currentIsDigit, isDigit( nextChar ) );
  27.                   if ( isBorder ){
  28.                     var partStr = key.slice( from, index );
  29.                         parts.push( new Part( partStr, currentIsDigit ) );
  30.                         from = index;
  31.                      break;
  32.                    }
  33.             }
  34.          }
  35.          else completed = true;
  36.        }
  37.      function Part( text, isNumber ){
  38.         this.isNumber = isNumber;
  39.         this.value = isNumber ? Number( text ) : text; }
  40.     }
  41.    
  42.     function compareSplitters( sp1, sp2 ){
  43.       var i = 0;
  44.         do {
  45.           var first = sp1.part( i ),
  46.               second = sp2.part( i );
  47.             if ( null !== first && null !== second ){
  48.               if ( xor( first.isNumber, second.isNumber ) ){
  49.                 return first.isNumber ? -1 : 1; }
  50.                   else {
  51.                     var comp = compare( first.value, second.value );
  52.                         if ( comp != 0 )
  53.                         return comp;
  54.                    }
  55.             } else return compare( sp1.count(), sp2.count() );
  56.          } while( ++i );
  57.          
  58.       function compare( a, b ){
  59.         return a < b ? -1 : a > b ? 1 : 0; }
  60.     }
  61.    
  62.    function xor( a, b ){
  63.       return a ? !b : b; }
  64.      
  65.    function isDigit( chr ){
  66.       var code = charCode( chr );
  67.     return code >= charCode("0") && code <= charCode("9");
  68.    
  69.      function charCode( c ){
  70.         return c.charCodeAt( 0 );
  71.         }
  72.    }
  73. }