2017-02-28 142 views
1

我有一個數組,其中包含兩種不同類型的對象,每個對象都有其自己的日期字段,其中的密鑰不同。見下:Javascript - 通過兩個日期屬性排列對象數組

const array = [ 
    { id: 1, occurs_at: '2017-02-03T07:00:01.000Z' }, 
    { id: 2, occurs_at: '2017-02-03T10:00:01.000Z' }, 
    { id: 3, start: '2017-02-03T04:00:01.000Z' }, 
    { id: 4, start: '2017-02-03T06:00:01.000Z' }, 
]; 

我試圖讓他們按升序,但我似乎無法找到解決方案。我一直在使用Lodash進行基於單個屬性的其他排序。有什麼想法嗎?

+0

有沒有辦法知道它會是哪個鍵?有兩個以上不同的日期鍵嗎?或者是'只有'和'開始'兩個可能的日期鍵?除了日期和ID以外,對象是否有更多的鍵? – Shilly

+0

start和happen_at是日期唯一可能的鍵嗎? – baao

+0

@baao正確。那些將是唯一可能的關鍵。 – AHinson

回答

5

您可以測試想要的屬性並只使用具有真值的值。

var array = [{ id: 1, occurs_at: '2017-02-03T07:00:01.000Z' }, { id: 2, occurs_at: '2017-02-03T10:00:01.000Z' }, { id: 3, start: '2017-02-03T04:00:01.000Z' }, { id: 4, start: '2017-02-03T06:00:01.000Z' }]; 
 

 
array.sort(function (a, b) { 
 
    return (a.occurs_at || a.start).localeCompare(b.occurs_at || b.start); 
 
}); 
 

 
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+2

優秀!這工作。謝謝 – AHinson

-3
array.sort(function(a, b) { 
    return new Date(b.occurs_at) - new Date(a.occurs_at); 
}); 
0

我會用sortBy()pick()

const sorted = _.sortBy(array, i => new Date(
    _(i) 
    .pick(['occurs_at', 'start']) 
    .values() 
    .first() 
)); 

如果你知道,每個集合項目都將有任何的occurs_atstart屬性,它是一個日期字符串,你可以使用pick()來得到兩個。顯然只有一個存在,所以這將返回一個正確值的對象。

此時,您不再關心密鑰,因爲您知道它具有單個日期值的對象。所以你可以使用values()first()

相關問題