如何在普通JS中按某个字段(如_.sortBy)对对象进行排序?

时间:2015-09-07 08:50:15

标签: javascript sorting momentjs lodash

我正在尝试根据数组对象的一个​​属性start对数组进行排序。

events = _.sortBy(events, function(a) {
    return moment(new Date(a.start)).format();
});

这给了我正确的结果。但是,以下情况并非如此。

events = events.sort(function(a, b) {
    return moment(new Date(a.start)).format() > moment(new Date(b.start)).format();
});

有谁知道发生了什么?

小提琴:https://jsfiddle.net/q24zx11h/1/

4 个答案:

答案 0 :(得分:2)

比较函数必须返回-1,0或1:

function compare(a, b) {
  if (a is less than b by some ordering criterion) {
    return -1;
  }
  if (a is greater than b by the ordering criterion) {
    return 1;
  }
  // a must be equal to b
  return 0;
}

目前你的代码返回布尔值,我认为它被解析为0或1,所以你的代码运行但不正确。

答案 1 :(得分:1)

这是the docs of Array.sort所说的:

  

arr.sort([compareFunction])

     

如果提供compareFunction,则对数组元素进行排序   根据比较函数的返回值。如果a和b是   比较两个要素,然后:

     
      
  • 如果compareFunction(a,b)小于0,则将a排序为低于b的索引,即a先出现。
  •   
  • 如果compareFunction(a,b)返回0,则保持a和b相对于彼此保持不变,但是对于所有不同的   元素。注意:ECMAscript标准不保证这一点   行为,因而并非所有浏览器(例如Mozilla版本约会   回到至少2003年)尊重这一点。
  •   
  • 如果compareFunction(a,b)大于0,则将b排序为低于a的索引。
  •   
  • compareFunction(a,b)在给定一对特定元素a和b作为其两个参数时必须始终返回相同的值。如果   返回不一致的结果,然后排序顺序未定义
  •   

你的函数返回一个布尔值,然后转换为Number01,在这种情况下0表示相等(作为&# 34;这些元素是相同的,按任何顺序排列")。

答案 2 :(得分:1)

比较器函数通常返回一个整数参数,表示以下值:

  • -1:a小于b
  • 0:a等于b
  • 1:a大于b

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

一个方便的技巧是从a的离散值中减去b的离散值,在您的情况下,例如通过使用时间戳:

function (a, b) { return (new Date(b)).getTime() - (new Date(a)).getTime(); }

如果b现在大于a,它将返回正值,依此类推。

答案 3 :(得分:0)

我发现你的代码都有相同的结果

 <md-button  ui-sref="menu1" >Menu1</md-button>
 <md-button>Menu2</md-button>

两个数组都返回了相同的结果。