forked from overset/javascript-natural-sort
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
correct sorting of scientific notation & number first alphanumerics; …
…fixes issue overset#8 Conflicts: naturalSort.js
- Loading branch information
Showing
1 changed file
with
45 additions
and
42 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,42 +1,45 @@ | ||
/* | ||
* Natural Sort algorithm for Javascript - Version 0.7 - Released under MIT license | ||
* Author: Jim Palmer (based on chunking idea from Dave Koelle) | ||
*/ | ||
function naturalSort (a, b) { | ||
var re = /(^-?[0-9]+(\.?[0-9]*)[df]?e?[0-9]?$|^0x[0-9a-f]+$|[0-9]+)/gi, | ||
sre = /(^[ ]*|[ ]*$)/g, | ||
dre = /(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/, | ||
hre = /^0x[0-9a-f]+$/i, | ||
ore = /^0/, | ||
i = function(s) { return naturalSort.insensitive && (''+s).toLowerCase() || ''+s }, | ||
// convert all to strings strip whitespace | ||
x = i(a).replace(sre, '') || '', | ||
y = i(b).replace(sre, '') || '', | ||
// chunk/tokenize | ||
xN = x.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'), | ||
yN = y.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'), | ||
// numeric, hex or date detection | ||
xD = parseInt(x.match(hre)) || (xN.length != 1 && x.match(dre) && Date.parse(x)), | ||
yD = parseInt(y.match(hre)) || xD && y.match(dre) && Date.parse(y) || null, | ||
oFxNcL, oFyNcL; | ||
// first try and sort Hex codes or Dates | ||
if (yD) | ||
if ( xD < yD ) return -1; | ||
else if ( xD > yD ) return 1; | ||
// natural sorting through split numeric strings and default strings | ||
for(var cLoc=0, numS=Math.max(xN.length, yN.length); cLoc < numS; cLoc++) { | ||
// find floats not starting with '0', string or 0 if not defined (Clint Priest) | ||
oFxNcL = !(xN[cLoc] || '').match(ore) && parseFloat(xN[cLoc]) || xN[cLoc] || 0; | ||
oFyNcL = !(yN[cLoc] || '').match(ore) && parseFloat(yN[cLoc]) || yN[cLoc] || 0; | ||
// handle numeric vs string comparison - number < string - (Kyle Adams) | ||
if (isNaN(oFxNcL) !== isNaN(oFyNcL)) { return (isNaN(oFxNcL)) ? 1 : -1; } | ||
// rely on string comparison if different types - i.e. '02' < 2 != '02' < '2' | ||
else if (typeof oFxNcL !== typeof oFyNcL) { | ||
oFxNcL += ''; | ||
oFyNcL += ''; | ||
} | ||
if (oFxNcL < oFyNcL) return -1; | ||
if (oFxNcL > oFyNcL) return 1; | ||
} | ||
return 0; | ||
} | ||
/* | ||
* Natural Sort algorithm for Javascript - Version 0.7 - Released under MIT license | ||
* Author: Jim Palmer (based on chunking idea from Dave Koelle) | ||
*/ | ||
/*jshint unused:false */ | ||
function naturalSort (a, b) { | ||
"use strict"; | ||
var re = /(^([+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?)?$|^0x[0-9a-f]+$|\d+)/gi, | ||
sre = /(^[ ]*|[ ]*$)/g, | ||
dre = /(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/, | ||
hre = /^0x[0-9a-f]+$/i, | ||
ore = /^0/, | ||
i = function(s) { return naturalSort.insensitive && ('' + s).toLowerCase() || '' + s; }, | ||
// convert all to strings strip whitespace | ||
x = i(a).replace(sre, '') || '', | ||
y = i(b).replace(sre, '') || '', | ||
// chunk/tokenize | ||
xN = x.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'), | ||
yN = y.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'), | ||
// numeric, hex or date detection | ||
xD = parseInt(x.match(hre), 16) || (xN.length !== 1 && x.match(dre) && Date.parse(x)), | ||
yD = parseInt(y.match(hre), 16) || xD && y.match(dre) && Date.parse(y) || null, | ||
oFxNcL, oFyNcL; | ||
// first try and sort Hex codes or Dates | ||
if (yD) { | ||
if ( xD < yD ) { return -1; } | ||
else if ( xD > yD ) { return 1; } | ||
} | ||
// natural sorting through split numeric strings and default strings | ||
for(var cLoc=0, numS=Math.max(xN.length, yN.length); cLoc < numS; cLoc++) { | ||
// find floats not starting with '0', string or 0 if not defined (Clint Priest) | ||
oFxNcL = !(xN[cLoc] || '').match(ore) && parseFloat(xN[cLoc]) || xN[cLoc] || 0; | ||
oFyNcL = !(yN[cLoc] || '').match(ore) && parseFloat(yN[cLoc]) || yN[cLoc] || 0; | ||
// handle numeric vs string comparison - number < string - (Kyle Adams) | ||
if (isNaN(oFxNcL) !== isNaN(oFyNcL)) { return (isNaN(oFxNcL)) ? 1 : -1; } | ||
// rely on string comparison if different types - i.e. '02' < 2 != '02' < '2' | ||
else if (typeof oFxNcL !== typeof oFyNcL) { | ||
oFxNcL += ''; | ||
oFyNcL += ''; | ||
} | ||
if (oFxNcL < oFyNcL) { return -1; } | ||
if (oFxNcL > oFyNcL) { return 1; } | ||
} | ||
return 0; | ||
} |