假设我有几个对象的数组:

var array = [{id: 1, date: Mar 12 2012 10:00:00 AM}, {id: 2, date: Mar 8 2012 08:00:00 AM}];

如何按日期元素对数组进行排序,从最接近当前日期和时间的日期开始排序?请记住,数组可能有许多对象,但为了简单起见,我使用了2.

我会使用排序函数和自定义比较器吗?

推荐答案

最简单的答案

array.sort(function(a,b){
  // Turn your strings into dates, and then subtract them
  // to get a value that is either negative, positive, or zero.
  return new Date(b.date) - new Date(a.date);
});

更一般的答案

array.sort(function(o1,o2){
  if (sort_o1_before_o2)    return -1;
  else if(sort_o1_after_o2) return  1;
  else                      return  0;
});

或者更简洁地说:

array.sort(function(o1,o2){
  return sort_o1_before_o2 ? -1 : sort_o1_after_o2 ? 1 : 0;
});

通用、有力的答案

在所有数组上使用Schwartzian transform定义自定义的不可枚举sortBy函数:

(function(){
  if (typeof Object.defineProperty === 'function'){
    try{Object.defineProperty(Array.prototype,'sortBy',{value:sb}); }catch(e){}
  }
  if (!Array.prototype.sortBy) Array.prototype.sortBy = sb;

  function sb(f){
    for (var i=this.length;i;){
      var o = this[--i];
      this[i] = [].concat(f.call(o,o,i),o);
    }
    this.sort(function(a,b){
      for (var i=0,len=a.length;i<len;++i){
        if (a[i]!=b[i]) return a[i]<b[i]?-1:1;
      }
      return 0;
    });
    for (var i=this.length;i;){
      this[--i]=this[i][this[i].length-1];
    }
    return this;
  }
})();

这样使用:

array.sortBy(function(o){ return o.date });

如果你的日期不是直接可比的,那就做一个可比的日期.

array.sortBy(function(o){ return new Date( o.date ) });

如果返回一个值数组,还可以使用此选项按多个条件进行排序:

// Sort by date, then score (reversed), then name
array.sortBy(function(o){ return [ o.date, -o.score, o.name ] };

See 100 for more details.

Javascript相关问答推荐

停止点击包装事件监听器

React,无法访问在 useEffect() 中传递给 setInterval() 的函数内状态变量的更新值

如何使用 Jquery 访问 JSON 的“对象”部分?

如何递归地materialized 一个字符串

当一次按下超过 2 个键时,p5.js keyIsDown() 行为不一致

我如何在这个动画 blob 中移动与“blob”的“交互”?

正则表达式替换未按预期在 nodejs 上工作的换行符

为什么我的 React.useEffect() 中有太多的重新渲染?

如何通过多列索引对多维数组进行排序

如何在不重新渲染未删除的项目的情况下从列表中删除项目?

切换暗模式 - 新创建元素的问题

两行相同代码的区别

React 审核表单在提交时未提交审核

将js日期时间转换为时刻

JavaScript:具有多个元素的 OnClick 在此关键字下返回“窗口”

删除芥末 CDN 存储桶 204 错误未删除

我可以将子元素的props 接口统一成一个父接口吗?

toString和数组join的时间复杂度差异

如何在 Javascript 中组合这 2 个正则表达式

React - 从子组件更新状态,然后根据状态做一些事情