Sort an array that contains a string, date and number

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' ]; 

I need to sort an array by date and number.

The result should be

 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' ]; 

I tried below code.this will do sorting only by date, but I need to sort by the number that is before '.txt'. How can i do this.

 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); }); 
+4
source share
4 answers

You can do it as follows:

 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] ); }); 

Note the use of .slice() to create a copy of the array. This can be omitted if you want to sort the original array in place. (Thanks @DerFlatulator for the reminder!)

+1
source

It worked for me.

 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

+1
source

Sort by numeric value in rows.

This implies:

  • numbers are integers
  • each row is different
  • dates can be sorted as numbers (year, month, day).

["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 

} );

result:

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

This extracts the numbers from the given string and puts the given weight on each numerical part. Thus, you can sort it in any order with the given priorities for Count, Day, Month, Year.

 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 } 

Exit

 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" ]*/ 

and fiddle

0
source

All Articles