2013-09-26 111 views
4
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' 
]; 

我需要按日期和数字对数组进行排序。排序包含字符串,日期和数字的数组

结果应该是

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

我曾尝试以下代码。此将仅日期,进行排序,但我需要的是之前”我.txt'.How可以做到这一点的数量进行排序。

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

}); 
+0

@sachin:您可以通过数字比较任意年月日的日期。您甚至可以将您的YYYY-MM-DD日期作为字符串进行比较,但这不是必需的。和比较数字是微不足道的(搜索它,如果你不知道它) – Bergi

+0

我只是尝试在Ela公布的链接和Bergi为您的用例建议的接受解决方案,它按您的需要排序。 –

+0

@Bergi我已经尝试过,但那是行不通的。 – sachin

回答

1

你可以做这样的:

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

注意使用.slice()创建数组的一个副本。如果您想对原始数组进行排序,则可以省略此项。 (感谢@DerFlatulator提醒!)

+0

嗨,我试过这个,但即时通讯错误在这一行:aa [1] sachin

+1

那个错误意味着正则表达式与数组元素中的文本不匹配。因此,您的数据看起来似乎与您在问题中发布的内容有所不同。如果您将'myArray'的定义粘贴到Chrome控制台中,然后粘贴上面的代码,'result'的值将会是您要查找的内容。你的数据或代码有什么不同? –

+0

@DerFlatulator我的数据是:cccc_aaaa_2013-09-26_ssss1.txt – sachin

1

这对我有效。

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

+0

我试过这个,但我没有得到确切的输出..首先我需要排序日期然后按照'.txt'之前的数字。现在只按日期排序而不是数字 – sachin

+0

检查最后的jsFiddle链接。右下方的面板显示输出,它按字符串和数字排序,这与日期和数字相同(只要日期和月份用'0'填充,例如'07'= 7月) – azz

+0

请将您的答案移动到http://stackoverflow.com/questions/19012468/javascript-sort-an-array-of-strings-that-c​​an-contain-letters-numbers-and-dates – hakre

0

按字符串内的数字值排序。

这是假设:

  • 数是整数
  • 每个字符串是不同
  • 日期可能会作为数字排序(年,月,日)

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

});

结果:

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

此,从给定串中提取的数字,并提出一个给定的重量上的每个数值的一部分。因此,您可以按照计数,日,月,年的优先顺序对其进行排序。

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, e.g 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 
} 

输出

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

Fiddle

相关问题