2015-09-07 50 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個對象。它顯示了相同的結果。 –