2017-10-14 71 views
0

之前,我將2個數組合併成一個數組,並使用sort(),我可以通過created_at對它們進行排序。使用不同的鍵排序多個數組對象

let result = [...item.messages, ...item.chat_messages] 
result.sort((a, b) => new Date(b.created_at) - new Date(a.created_at)) 
item.messages = result 

現在,我在另一種情況。我想添加一個更多的數組(sms_messages)到這個數組中,但是想讓它按scheduled_at字段排序。

用這種方法可以實現嗎?

let result = [...item.messages, ...item.chat_messages, ...item.sms_messages] 
// and order by messages' and chat_messages' created_at (like above) together as 
// sms_messages' sheduled_at 
+0

只有短信有'scheduled_at'道具嗎? –

+0

@OriDrori,是的。其他人應該像以前一樣使用'created_at',但短信需要使用'scheduled_at'。所以我可以按照相關順序給出一個列表 – senty

+0

請提供您想要使用的數據結構的實際完整示例。很難從你的描述中辨別出來。 –

回答

1

你可以使用||拿到第一發現是有兩個屬性,假設每個對象有兩個屬性中的至少一個,但scheduled_at得到優先:

result.sort((a, b) => 
    new Date(b.scheduled_at || b.created_at) - new Date(a.scheduled_at || a.created_at)) 
+0

這似乎是一個很好的方法,但短信具有'created_at'屬性以及'scheduled_at',我認爲它是按'created_at'排序,而不是在 – senty

+1

排定。情況不應該如此:'scheduled_at'被採用在回落到'created_at'之前存在。如果一個對象具有兩個屬性,則會使用'scheduled_at'。 – trincot

+0

是的,我很抱歉。它像魅力一樣工作!感謝百萬 – senty

0

只是檢查哪些屬性存在並使用它來對對象進行排序。

const sortByDate = props => { 
    return (a, b) => { 
    let propA = props.find(p => a.hasOwnProperty(p)); 
    let propB = props.find(p => b.hasOwnProperty(p)); 
    if(!propA || !propB) return 0; 
    return new Date(b[propB]) - new Date(a[propA]); 
    }; 
} 

result.sort(sortByDate(['scheduled_at', 'created_at'])); 
+0

但sms_messages有'scheduled_at'和'created_at'兩個屬性。我認爲這不會解決這個問題,因爲它 – senty

+0

在我的示例中,它優先考慮'scheduled_at'屬性,然後回退到'created_at'。所以如果'scheduled_at'出現在對象上,它將被'sheduled_at'排序。 – cyrix