2016-04-22 9 views
1

Ich habe ein Array so etwas wie:Javascript - sort alpha dann numerisch

['honda accord', '1986 honda accord', '1990 honda accord', '2000 honda accord', '2011 honda accord', '2016 honda accord']. 

Ich brauche dies in Javascript zu sortieren, so dass das Ergebnis:

['honda accord', '2016 honda accord', '2011 honda accord', '2000 honda accord', '1990 honda accord', '1986 honda accord']. 

, wie ich dies tun kann.

array.sort() 

funktioniert nicht. Ich weiß, dass ich eine Funktion zum Sortieren senden muss.

Dank Brian

Antwort

2

Sie split verwenden könnten und erstes Element der

var arr = ['honda accord', '1986 honda accord', '1990 honda accord', '2000 honda accord', '2011 honda accord', '2016 honda accord']; 
 

 
arr.sort((a, b) => b.split(' ')[0] - a.split(' ')[0]) 
 

 
document.write(JSON.stringify(arr));

+1

das ist es hier, gut gemacht – JordanHendrix

+1

dies funktioniert, vielen Dank für die Zeit nehmen, zu helfen – user1050544

1

Arbeits Fiddle Zeichenfolge überprüfen:https://jsfiddle.net/7nu7bp3g/

var arr = [ 
      'honda accord', 
      '1986 honda accord', 
      '1990 honda accord', 
      '2000 honda accord', 
      '2011 honda accord', 
      '2016 honda accord' 
      ]; 

var sortArr = arr.sort(function(a, b) { 
return b.split(' ')[0] - a.split(' ')[0]; 
}); 

console.log(sortArr); 

Ich hoffe, es wird funktionieren.

0

Es ist nicht sehr elegant (oder effizient), aber es funktioniert. Im Wesentlichen verwendet es regulären Ausdruck, um das Jahr von jedem Auto zu extrahieren und dann zu vergleichen.

// the regular expression to extract the year and car 
var regEx = /((\d+)\s)*(.*)/; 

var list = ['honda accord', '1986 honda accord', '1990 honda accord', '2000 honda accord', '2011 honda accord', '2016 honda accord']; 

// custom sort function 
list.sort(function(a, b) 
{ 
    // get the car details 
    var aR = regEx.exec(a); 
    var bR = regEx.exec(b); 

    var aCar = aR[3]; 
    var bCar = bR[3]; 

    var aYear = aR[2]; 
    var bYear = bR[2]; 

    // compare the strings 
    if(aCar < bCar) return -1; 
    else if(aCar > bCar) return 1; 
    // we'll only get this far if both strings are the same 

    // if there was no year provided then it should be first 
    else if(!aYear) return -1; 
    else if(!bYear) return 1; 

    // at this point the car types are the same, and both have an year so compare the year 
    else if(aYear < bYear) return 1; 
    else if(aYear > bYear) return -1; 
    return 0; 
}) 

Sie könnten es effizienter machen, indem Sie die Liste vorverarbeiten, um die Regex für alle Elemente auszuführen.

0

Eine Lösung mit ersetzen, wenn kein Jahr

var array = ['honda accord', '1986 honda accord', '1990 honda accord', '2000 honda accord', '2011 honda accord', '2016 honda accord']; 
 

 
array.sort((a, b) => b.replace(/^\D*$/g, '9999 $1').localeCompare(a.replace(/^\D*$/g, '9999 $1'))); 
 

 
document.write('<pre>' + JSON.stringify(array, 0, 4) + '</pre>');
gegeben

Verwandte Themen