排序不正常

时间:2017-10-26 08:36:12

标签: javascript jquery sorting

我试图按desc明智地排序日期。但得到错误的结果。任何人帮助我?其实我的日期值是“DD / MM / YYYY”

这是我的尝试:

var sortDate = [
  "08/10/2017",
  "08/03/2017",
  "07/04/2017",
  "07/09/2016",
  "07/08/2017",
  "22/07/2017",
  "16/12/2017"
]

sortDate.sort(function(a,b){

  var aComps = a.split("/");
  var bComps = b.split("/");
  
	new Date( bComps[2] +"/"+ bComps[1] +"/"+ bComps[0]) - 
  new Date( aComps[2] +"/"+ aComps[1] +"/"+ aComps[0] )
  
})

console.log(sortDate)

Live Demo

6 个答案:

答案 0 :(得分:4)

您的数据似乎已经有0前缀填充,因此日期和月份的值始终为2位数。

所以,无需解析为日期,只需使用localeCompare进行字符串比较

return  ( aComps[2] + aComps[1] + aComps[0] ).localeCompare( bComps[2] + bComps[1] + bComps[0] );      

<强>演示

var sortDate = [
  "08/10/2017",
  "08/03/2017",
  "07/04/2017",
  "07/09/2016",
  "07/08/2017",
  "22/07/2017",
  "16/12/2017"
]

sortDate.sort(function(a,b){
    var aComps = a.split("/");
    var bComps = b.split("/");
    return  ( aComps[2] + aComps[1] + aComps[0] ).localeCompare( bComps[2] + bComps[1] + bComps[0] );      
})

console.log(sortDate)

答案 1 :(得分:1)

您可以创建ISO 8601日期字符串,并将其与String#localeCompare一起用于排序。

var sortDate = ["08/10/2017", "08/03/2017", "07/04/2017", "07/09/2016", "07/08/2017", "22/07/2017", "16/12/2017"];

sortDate.sort(function (a, b) {
    function getISO(s) {
        return s.replace(/(\d{2})\/(\d{2})\/(\d{4})/, '$3-$2-$1');
    }

    return getISO(a).localeCompare(getISO(b));
});

console.log(sortDate);

答案 2 :(得分:0)

您需要从函数返回值:

&#13;
&#13;
sortDate.sort(function(a,b){

  var aComps = a.split("/");
  var bComps = b.split("/");

   return  new Date( bComps[2] +"/"+ bComps[1] +"/"+ bComps[0]) - 
  new Date( aComps[2] +"/"+ aComps[1] +"/"+ aComps[0] )

})
&#13;
&#13;
&#13;

答案 3 :(得分:0)

你可以做这样的事情

&#13;
&#13;
var sortDate = [
  "08/10/2017",
  "08/03/2017",
  "07/04/2017",
  "07/09/2016",
  "07/08/2017",
  "22/07/2017",
  "16/12/2017"
]

sortDate.sort(function(a,b){

  var aComps = a.split("/").reverse().join("/");
  var bComps = b.split("/").reverse().join("/");
  
	return new Date(aComps) - 
  new Date(bComps )
  
})

console.log(sortDate)
&#13;
&#13;
&#13;

答案 4 :(得分:0)

你可以试试这个

var sortDate = [
 "08/10/2017",
 "08/03/2017",
 "07/04/2017",
 "07/09/2016",
 "07/08/2017",
 "22/07/2017",
 "16/12/2017"
]

sortDate.sort(function(a,b){
var aComps = a.split("/");
var bComps = b.split("/");

var date1 = new Date();
var date2 = new Date();
console.log(a)
date1.setMonth(aComps[1]-1)
date1.setFullYear(aComps[2]);
date1.setDate(aComps[0]);
console.log(date1)
console.log(b)
date2.setMonth(bComps[1]-1)
date2.setFullYear(bComps[2]);
date2.setDate(bComps[0]);


console.log(date2)

return date2 - date1;

})

console.log(sortDate)

答案 5 :(得分:0)

你可以使用Date,但它比简单的字符串比较慢。

您可以使用String.prototype.localeCompare(),但它比数字比较慢得多。

为了使其有效并优化您的功能,您可以这样做:

var dates = [
  "08/10/2017",
  "08/03/2017",
  "07/04/2017",
  "07/09/2016",
  "07/08/2017",
  "22/07/2017",
  "16/12/2017"
]

dates.sort(function (a, b) {
  arA = a.split("/");
  arB = b.split("/");
  
  return Number(arA[2] + arA[1] + arA[0]) - Number(arB[2] + arB[1] + arB[0]);
});

console.log(dates);