Tri d'un tableau contenant une chaîne, une date et un numéro

var myArray = [ '_aaaa_2013-09-25_ssss9.txt', '_aaaa_2013-09-25_ssss8.txt', '_aaaa_2013-09-26_ssss1.txt', '_aaaa_2013-09-25_ssss10.txt', '_aaaa_2013-09-26_ssss2.txt', '_aaaa_2013-09-25_ssss13.txt', '_aaaa_2013-09-25_ssss5.txt', '_aaaa_2013-09-25_ssss6.txt', '_aaaa_2013-09-25_ssss7.txt' ]; 

J'ai besoin de trier le tableau par date et par numéro.

Le résultat devrait être

 var result = [ '_aaaa_2013-09-25_ssss5.txt', '_aaaa_2013-09-25_ssss6.txt', '_aaaa_2013-09-25_ssss7.txt', '_aaaa_2013-09-25_ssss8.txt', '_aaaa_2013-09-25_ssss9.txt', '_aaaa_2013-09-25_ssss13.txt', '_aaaa_2013-09-26_ssss1.txt', '_aaaa_2013-09-26_ssss2.txt' ]; 

J'ai essayé ci-dessous code. Cela fera le tri par date seulement, mais je dois trier par le nombre qui est avant ".txt". Comment puis-je faire cela.

 myArray.sort(function (a, b) { var timeStamp1 = a.substring(a.indexOf('_aaaa') + 6, a.indexOf('_ssss')); var timeStamp2 = b.substring(b.indexOf('_aaaa') + 6, b.indexOf('_ssss')); timeStamp1 = new Date(Date.UTC(timeStamp1[0], timeStamp1[1], timeStamp1[2])); timeStamp2 = new Date(Date.UTC(timeStamp2[0], timeStamp2[1], timeStamp2[2])); return (timeStamp1 > timeStamp2) ? 1 : (timeStamp2 > timeStamp1 ? -1 : 0); }); 

Vous pourriez le faire comme ceci:

 var re = /^_aaaa_(\d\d\d\d-\d\d-\d\d)_ssss(\d+)\.txt$/; var result = myArray.slice().sort( function( a, b ) { var aa = a.match(re), bb = b.match(re); return( aa[1] < bb[1] ? -1 : aa[1] > bb[1] ? 1 : aa[2] - bb[2] ); }); 

Notez l'utilisation de .slice() pour créer une copie du tableau. Cela peut être omis si vous souhaitez trier le tableau d'origine en place. (Merci à @DerFlatulator pour le rappel!)

Cela a fonctionné pour moi.

 myArray.sort(function (a, b) { var a_s = a.substring(0, a.indexOf('ssss') + 4); var a_n = a.substring(a.indexOf('ssss') + 4, a.indexOf('.txt')); var b_s = b.substring(0, b.indexOf('ssss') + 4); var b_n = b.substring(b.indexOf('ssss') + 4, b.indexOf('.txt')); if (a_s < b_s) return -1; if (a_s > b_s) return 1; return parseInt(a_n) - parseInt(b_n); }); 

JsFiddle

Trier par valeur numérique dans les chaînes.

Cela suppose:

  • Les chiffres sont des nombres entiers
  • Chaque chaîne est différente
  • Les dates peuvent être triées en chiffres (année, mois, jour)

["aa_123","aa_13","aa_2","aa_22_bb_23","aa_22_bb_3"].sort( function ( a , b ) {

  var as = a.split(/([0-9]+)/); // splits string retaining separators var bs = b.split(/([0-9]+)/); var i,c = Math.min(as.length,bs.length); for ( i=0;i<c && as[i]===bs[i];++i ) ; var an = (i&1)?+as[i]:as[i]; // separators (digits) always at odd index var bn = (i&1)?+bs[i]:bs[i]; return (an<bn)?-1:1; // assumes every string different 

} );

résultat:

 [ "aa_2", "aa_13", "aa_22_bb_3", "aa_22_bb_23", "aa_123" ] 

Ceci, extrait les nombres de la chaîne donnée et met un poids donné sur chaque partie numérique. Ainsi, vous pouvez le trier dans n'importe quel ordre avec des priorités pour le compte, le jour, le mois, l'année.

 function weightedNumSort(myArray,weightNum,weightString) { var WEIGHTS_NUM = weightNum || [1,2,4,3]; //[YEAR,MONTH,DAY,COUNT], You can pass an array with appropriate weights for the number at the given position in the text, eg year is the first Number var WEIGHT_STRING = weightString || 1; //And a weight for the string value. If none get passed, default weights are used function weightedSum (a,b,i) { return ( a + b * ( WEIGHTS_NUM [i-1] || 1 )); } myArray = myArray.slice().sort(function (a, b) { var reg = /(\d+)/g //A regex to extract the numerical part var lNum = a.match(reg) //Extract the numerical parts we now have an array ["2013","09","26","2"] var rNum = b.match(reg) var delta = Array.apply(null,{length:lNum.length+1}); delta [0] = 0; //add a 0 at the beginning, for convenience with the reduce function for (var i=0,j=lNum.length; i < j; i++) { var value = lNum[i] - rNum[i]; value = ~~ (value / Math.abs (value)) // 1 for positive values, 0 for 0 , -1 for negative values, to make weighting easier delta[i+1] = value; } var weightedNumValue = delta.reduce (weightedSum) //Put a weight on the number parts. var weightedStrValue = WEIGHT_STRING * ( a > b ? 1 : a < b ? -1 : 0 ) return weightedNumValue + weightedStrValue //Add the weighted values and we have a positive or negative value with a correct weight on the numerical parts }) return myArray } 

Sortie

 console.log ( weightedNumSort (myArray) ) /* [ "_aaaa_2013-09-25_ssss5.txt", "_aaaa_2013-09-25_ssss6.txt", "_aaaa_2013-09-25_ssss7.txt", "_aaaa_2013-09-25_ssss8.txt", "_aaaa_2013-09-25_ssss9.txt", "_aaaa_2013-09-25_ssss10.txt", "_aaaa_2013-09-25_ssss13.txt", "_aaaa_2013-09-26_ssss1.txt", "_aaaa_2013-09-26_ssss2.txt" ]*/ 

Et un violon