2017-02-01 3 views
8

ich ein gemischtes Array, die ich nach der Anzahl, Alphabet sortiert werden müssen und dann von Ziffern-wie gemischt Ziffern/Buchstaben-Array sortieren in Javascript

['A1', 'A10', 'A11', 'A12', 'A3A', 'A3B', 'A3', 'A4', 'B10', 'B2', 'F1', '1', '2', 'F3'] 

wie sortiere ich es sein wie:

Hier
['1', '2', 'A1', 'A2', 'A3', 'A3A', 'A3B', 'A4', 'A10', 'A11', 'A12', 'B2', 'B10', 'F1', 'F3'] 

ist, was ich versuchte:

var reA = /[^a-zA-Z]/g; 
var reN = /[^0-9]/g; 
function sortAlphaNum(a, b) { 
    var AInt = parseInt(a.Field, 10); 
    var BInt = parseInt(b.Field, 10); 

    if (isNaN(AInt) && isNaN(BInt)) { 
     var aA = (a.Field).replace(reA, ""); 
     var bA = (b.Field).replace(reA, ""); 
     if (aA === bA) { 
      var aN = parseInt((a.Field).replace(reN, ""), 10); 
      var bN = parseInt((b.Field).replace(reN, ""), 10); 
      return aN === bN ? 0 : aN > bN ? 1 : -1; 
     } else { 
      return aA > bA ? 1 : -1; 
     } 
    } else if (isNaN(AInt)) {//A is not an Int 
     return 1;//to make alphanumeric sort first return -1 here 
    } else if (isNaN(BInt)) {//B is not an Int 
     return -1;//to make alphanumeric sort first return 1 here 
    } else { 
     return AInt > BInt ? 1 : -1; 
    } 
} 

fieldselecteddata.sort(sortAlphaNum); 

aber, dass nur sortiert sich alphabetisch/numerisch bis Kombination aus 1 numerischen einem d 1 Zeichen wie A1, A2, A10. Aber wenn es Werte wie A3A, gibt, wird es in diesem Fall nicht richtig sortieren. Kann dies entweder mit direktem JavaScript oder jQuery gemacht werden?

+0

@RameshRajendran Das ist ** nicht ** eine gültige Entschuldigung für eine Frage Wegthema, dies ist in der Tat auf dem Thema und eine gute Frage. Es spielt keine Rolle, ob dies eine Hausaufgabe ist oder nicht. Der Benutzer hat ein klares Ziel und eine klare Ausgabe und damit eine versuchte Lösung vorgebracht. Das ist viel besser als die meisten Fragen, die ich hier sehe. –

+0

@RameshRajendran Das ist eigentlich eine sehr gute Frage. Es sollte geschützt statt geschlossen sein. –

Antwort

2

var arr = ['A1', 'A10', 'A11', 'A12', 'A3A', 'A3B', 'A3', 'A4', 'B10', 'B2', 'F1', '1', '2', 'F3']; 
 

 
// regular expression to get the alphabetic and the number parts, if any 
 
var regex = /^([a-z]*)(\d*)/i; 
 

 
function sortFn(a, b) { 
 
    var _a = a.match(regex); 
 
    var _b = b.match(regex); 
 

 
    // if the alphabetic part of a is less than that of b => -1 
 
    if (_a[1] < _b[1]) return -1; 
 
    // if the alphabetic part of a is greater than that of b => 1 
 
    if (_a[1] > _b[1]) return 1; 
 

 
    // if the alphabetic parts are equal, check the number parts 
 
    var _n = parseInt(_a[2]) - parseInt(_b[2]); 
 
    if(_n == 0) // if the number parts are equal start a recursive test on the rest 
 
     return sortFn(a.substr(_a[0].length), b.substr(_b[0].length)); 
 
    // else, just sort using the numbers parts 
 
    return _n; 
 
} 
 

 
console.log(arr.sort(sortFn));

Hinweis: der i Modifikator im regulären Ausdruck (/.../i) bedeutet Groß- und Kleinschreibung (sieht für beide Kleinbuchstaben und Großbuchstaben).

+0

Der Ausgang Mismatch mit dem, was OP exceptation ' "A1", "A3A" "A3B" "A3", ' –

+1

@RameshRajendran ich es fixiert. –

0

Probieren Sie diese Funktion aus. geben Sie das Ergebnis, das Sie genau

var arr = ['A1', 'A10', 'A11', 'A12', 'A3A', 'A3B', 'A3', 'A4', 'B10', 'B2', 'F1', '1', '2', 'F3']; 
 
function sortFn(a, b) {  
 
    var ax = [], bx = []; 
 
    a.replace(/(\d+)|(\D+)/g, function(_, $1, $2) { ax.push([$1 || Infinity, $2 || ""]) }); 
 
    b.replace(/(\d+)|(\D+)/g, function(_, $1, $2) { bx.push([$1 || Infinity, $2 || ""]) });   
 
    while(ax.length && bx.length) { 
 
     var an = ax.shift(); 
 
     var bn = bx.shift(); 
 
     var nn = (an[0] - bn[0]) || an[1].localeCompare(bn[1]); 
 
     if(nn) return nn; 
 
    } 
 
    return ax.length - bx.length;  
 
} 
 
console.log(arr.sort(sortFn));

0

wollen Sie es mit gesplitteten Array nach Typ sortiert werden könnte und prüfen auf Gleichheit und dann nach Art.

var array = ['A1', 'A10', 'A11', 'A12', 'A3A', 'A3B', 'A3', 'A4', 'B10', 'B2', 'F1', '1', '2', 'F3']; 
 

 
array.sort(function (a, b) { 
 
    var isNumber = function (v) { return (+v).toString() === v; }, 
 
     aa = a.match(/\d+|\D+/g), 
 
     bb = b.match(/\d+|\D+/g), 
 
     i = 0, 
 
     l = Math.min(aa.length, bb.length); 
 

 
    while (i < l && aa[i] === bb[i]) { 
 
     i++; 
 
    } 
 
    if (i === l) { 
 
     return aa.length - bb.length; 
 
    } 
 
    if (isNumber(aa[i]) && isNumber(bb[i])) { 
 
     return aa[i] - bb[i]; 
 
    } 
 
    return aa[i].localeCompare(bb[i]); 
 
}); 
 

 
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

0
var a=[ { 
    "LIST": "14:NATURAL RESOURCES" 
}, 
{ 
    "LIST": "7:DIVERSITY IN LIVING ORGANISMS" 
}, 
{ 
    "LIST": "3:ATOMS AND MOLECULES" 
}, 
{ 
    "LIST": "10:GRAVITATION" 
}, 
{ 
    "LIST": "6:TISSUES" 
}] 

var c=a.sort(function(a,b){ 
let aa=a.LIST,bb=b.LIST; 
return parseInt(aa.split(":")[0] - bb.split(":")[0]) 

}) 

console.log(c)