2015-09-07 54 views
0

我想基于数组对象的一个​​属性start对数组进行排序。如何通过纯JS中的某个字段(如_.sortBy)对对象进行排序?

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/

+8

'sort'函数参数应返回'{-1; 0; 1}'不是布尔值。顺便说一句,有没有理由把日期对象包裹在“时刻”对象中? – zerkms

+2

你不需要做'foo = foo.sort(..)','.sort'有副作用/修改原始数组 –

+0

我只想比较一下所有的时间。我会'时刻(新日期(xxx))'而不是'时刻(xxx)',因为后者有时会给我发出警告信息。也许我所做的并不是必要的? –

回答

1

比较器功能通常会返回一个整数参数指示以下值:

  • -1:a是小于b
  • 0:一个等于B
  • 1:A比B
  • 较大

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

一个方便的技巧是减去012的离散值通过使用时间戳的b离散值,你的情况,例如:

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

如果b比现在更大,它会返回一个正值,等等。

+0

好吧,我明白为什么它不被排序谢谢! –

+0

@ Shih-MinLee请接受答案,如果它回答你的问题:) –

+0

我会去lodash,但这不应该使用外部库时应该是正确的。谢谢! –

1

这是the docs of Array.sort说:

arr.sort([compareFunction])

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

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

你的函数返回一个布尔值,然后将其转换为Number,这是01,在这种情况下0意味着相等的(如“这些元素是相同的,以任何顺序放置它们“)。

+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,因此您的代码运行,但不正确。

0

我发现这两个验证码

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

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

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

+0

我认为它不应该。第一个结果是搞砸了。 –

+0

我试过在天数组中只有2个对象。它显示了相同的结果。 –