按日期排序数组

时间:2016-08-09 16:40:35

标签: javascript jquery angularjs

如何按每个对象的dt(date)属性对以下示例数组进行排序?

$scope.arr = [ 
    {test: 1, dt: 'March, 10 2016 14:55:00'},
    {test: 2, dt: 'February, 10 2013 14:25:00'},
    {test: 3, dt: 'August, 10 2015 14:55:00'} 
];

我尝试了_.sortBy($ scope.arr,'dt'),但是它将日期视为字符串,并且只按字母顺序进行排序。我尝试将日期转换为unix时间,这实际上很复杂,因为我的实际代码更复杂。

您是否有任何其他建议按降序对上述内容进行排序并在下拉列表中显示结果?

5 个答案:

答案 0 :(得分:5)

您可以使用此回调进行排序,该回调使用Date等效项进行比较:

$scope.arr.sort( (a, b) => new Date(a.dt) - new Date(b.dt) );

$scope = {}; // for the snippet to work
$scope.arr = [ 
    {test: 1, dt: 'March, 10 2016 14:55:00'},
    {test: 2, dt: 'February, 10 2013 14:25:00'},
    {test: 3, dt: 'August, 10 2015 14:55:00'} 
];

$scope.arr.sort( (a, b) => new Date(a.dt) - new Date(b.dt) );

console.log($scope.arr);

答案 1 :(得分:3)

只需对作为日期对象的第二个属性进行排序:



var arr = [
    {test: 1, dt: 'March, 10 2016 14:55:00'},
    {test: 2, dt: 'February, 10 2013 14:25:00'},
    {test: 3, dt: 'August, 10 2015 14:55:00'}
];

arr.sort((a,b) => new Date(b.dt) - new Date(a.dt));
console.log(arr);




答案 2 :(得分:2)

由于这些日期并非真正有效,即使某些浏览器可以对其进行解析,您通常也需要正确解析它们并将数字传递给new Date,然后根据日期对象等。



var months = [
  'January',
  'February',
  'March',
  'April',
  'June',
  'July',
  'August',
  'September',
  'October',
  'November',
  'December'
];

function parse(dt) {
  var p = dt.replace(/(\,|\:)/g, ' ').split(/\s+/).filter((x) => {
    return x.trim().length > 0;
  });
  return new Date(p[2], months.indexOf(p[0]), p[1], p[3], p[4], p[5]);
}
var $scope = {}; // for demonstration ...

$scope.arr = [{
  test: 1,
  dt: 'March, 10 2016 14:55:00'
}, {
  test: 2,
  dt: 'February, 10 2013 14:25:00'
}, {
  test: 3,
  dt: 'August, 10 2015 14:55:00'
}];

$scope.arr.sort((a, b) => {
  return parse(b.dt) - parse(a.dt);
});

document.body.innerHTML = '<pre>' + JSON.stringify($scope.arr, 0, 4) + '</pre>';
&#13;
&#13;
&#13;

答案 3 :(得分:0)

您可以通过多种方式解决问题。您可以更改日期的格式以返回类似“YYYY-MM-DDThh:mm:ss.sTZD”的内容,然后使用orderBy来利用角度顺序。否则,您可以使用时刻库​​手动循环和排序。

像这样的东西

angular.forEach($scope.arr, function(o){ o.dt = new Date(o.dt); });

然后用户orderBy进行排序。

答案 4 :(得分:0)

Angular Custom Filter和orderBy过滤器的组合可以实现这一点。这也将允许进一​​步的自定义格式化。

更新:现在显示添加新日期和按任何字段排序。

WebDriver driver = new SafariDriver();
driver.get("http://www.google.com");
angular.module("app", ['core']);

angular.module("app").controller("TestCtrl", function($scope) {

  $scope.arr = [{
    test: 1,
    dt: new Date('March, 10 2016 14:55:00')
  }, {
    test: 2,
    dt: new Date('February, 10 2013 14:25:00')
  }, {
    test: 3,
    dt: new Date('August, 10 2015 14:55:00')
  }];

  $scope.addDate = function() {
    var lastIndex = $scope.arr[$scope.arr.length - 1].test;
    $scope.arr.push({
      test: lastIndex + 1,
      dt: new Date($scope.newDate)
    });
  }

});

angular.module("core", []);
angular.module("core").filter("format", function(dateFilter) {
  return function(input) {
    if (input instanceof Date)
      return dateFilter(input, 'medium');
    return input;
  };
});