Javascript 对包含字符串、日期和数字的数组进行排序

Javascript 对包含字符串、日期和数字的数组进行排序,javascript,arrays,sorting,Javascript,Arrays,Sorting,我需要按日期和数字对数组进行排序 结果应该是 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', '

我需要按日期和数字对数组进行排序

结果应该是

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'
];
我尝试了下面的代码。这将只按日期排序,但我需要按“.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'
];
这对我有用

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

});
myArray.sort(函数(a,b){
var a_s=a.子串(0,a.indexOf('ssss')+4);
var a_n=a.substring(a.indexOf('ssss')+4,a.indexOf('txt'));
var b_s=b.子串(0,b.indexOf('ssss')+4);
var b_n=b.substring(b.indexOf('ssss')+4,b.indexOf('txt'));
如果(a_sb_s)
返回1;
返回parseInt(a_n)-parseInt(b_n);
});

您可以这样做:

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);
});
var re=/^ aaaa(\d\d\d\d-\d\d-\d\d)ssss(\d+)\.txt$/;
var result=myArray.slice().sort(函数(a,b){
var aa=a.匹配(re),bb=b.匹配(re);
返回(
aa[1]bb[1]?1:
aa[2]-bb[2]
);
});

请注意使用
.slice()
创建数组的副本。如果要对原始数组进行适当排序,可以忽略此项。(感谢@DerFlatulator的提醒!)

按字符串中的数值排序

这假定:

  • 数字是整数
  • 每根弦都是不同的
  • 日期可以按数字排序(年、月、日)
[“aa_123”、“aa_13”、“aa_2”、“aa_22_bbu 23”、“aa_22_bbu 3”]排序(函数(a,b){

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

这将从给定字符串中提取数字,并对每个数字部分赋予给定的权重。因此,您可以根据计数、日期、月份和年份的给定优先级按任意顺序对其进行排序

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

和a

@sachin:您可以按数字比较任何YMD日期。您可以将YYYY-MM-DD日期作为字符串进行比较,但此处不需要。比较数字很简单(如果您不知道,请搜索)我刚刚在Ela发布的链接和Bergi为您的用例建议的链接中尝试了可接受的解决方案,它按您的意愿排序。@Bergi我已经尝试过了,但不起作用。return(timeStamp1>timeStamp2)?1:0;永远不要因为到目前为止你还没有得到答案而重复你自己的问题。而是编辑和改进你现有的问题。您好,我尝试了这一点,但我在这一行中遇到了错误:aa[1]myArray的定义粘贴到Chrome控制台中,然后将我的代码粘贴到上面,则值您需要的是
result
。您的数据或代码有什么不同?@DerFlatulator我的数据是:cccc_aaaa_2013-09-26_ssssss1.txt请注意,此答案将修改
myArray
,并将结果存储在
result
中。如果您想制作数组的浅拷贝,请使用类似于
va的工具r result=myArray.slice().sort(…);
另外,为什么我在这个答案中被标记?我尝试了这个方法,但没有得到准确的输出。首先我需要按日期排序,然后按“.txt”之前的数字排序。现在它只按日期排序,而不是按数字排序。请检查最后的JSFIDLE链接。(底部-)上的面板右边显示输出,它按字符串然后数字排序,这与日期然后数字相同(只要日期和月份用
0
,例如
07
=July)填充在左边,请将答案移到,如果您认为这是一个很好的答案(值得采取行动),请将其移到dupe的dupe。
[
  "aa_2",
  "aa_13",
  "aa_22_bb_3",
  "aa_22_bb_23",
  "aa_123"
]
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"
]*/