[英]How to sort array of objects by date when the property is different
我有一個對象數組,我想按日期對其進行排序(在這種情況下,它是名稱中包含occurredAt
的屬性)。 這是數組:
const arr = [
{
EmailCampaignEvents.campaignRef: "test6example1",
EmailCampaignEvents.campaignSentAt: "2021-04-09T13:19:24.000",
EmailCampaignEvents.customerRef: "Customer/activityTest10",
EmailCampaignEvents.emailRef: "Email/9374eaee0713f36a247b0d0c863e920b",
EmailCampaignEvents.eventType: "delivery",
EmailCampaignEvents.occurredAt: "2021-04-09T13:19:25.000",
},
{
Events.occurredAt: "2017-01-11T17:29:57.000",
Events.productRef: "Event/201-13",
Events.relatedEntityRefFlat: "Customer/201-5645307",
Events.transactionCurrency: "SEK",
Events.transactionItemCount: "4",
Events.transactionItemPrice: "235.85",
Events.type: "as.commerce.transaction.completed",
relatedEventName: "Hammarby-Östersunds FK",
},
{
Events.occurredAt: "2018-01-11T17:29:57.000",
Events.productRef: "Event/201-13",
Events.relatedEntityRefFlat: "Customer/201-5645307",
Events.transactionCurrency: "SEK",
Events.transactionItemCount: "2",
Events.transactionItemPrice: "135.85",
Events.type: "as.commerce.transaction.completed",
relatedEventName: "Hammarby-Östersunds FK",
},
];
請注意,在第一個 object 中,我有EmailCampaignEvents.occurredAt
,在 rest 兩個中,我有一個類似Events.occurredAt
的屬性。 是否可以以某種方式對該數組進行排序? 任何例子將不勝感激!
問題的症結在於存儲occurredAt
日期值的對象的變量鍵名,您可以定義自定義方法來通過檢查每個對象鍵中的ZE83AED3DDF4667DEC0DAAAACB2BB3BE0BZ來獲取值。
const getOccurredAt = (obj) => {
const key = Object.keys(obj).filter(k => k.includes('occurredAt'))[0];
if (key) {
return obj[key];
}
return null; // Set a default based on your use-case
}
arr.sort((x, y) => {
const xVal = getOccurredAt(x);
const yVal = getOccurredAt(y);
return new Date(yVal) - new Date(xVal);
})
這將解決您的問題,但如果可能的話,我絕對建議在所有對象中為相同數據使用一致的鍵名。
將Array.prototype.sort()
與自定義排序 function 一起使用。 您可以使用Object.keys()
查找以 .occurredAt 結尾的.occurredAt
鍵。 像這樣:
const arr = [ { "EmailCampaignEvents.campaignRef": "test6example1", "EmailCampaignEvents.campaignSentAt": "2021-04-09T13:19:24.000", "EmailCampaignEvents.customerRef": "Customer/activityTest10", "EmailCampaignEvents.emailRef": "Email/9374eaee0713f36a247b0d0c863e920b", "EmailCampaignEvents.eventType": "delivery", "EmailCampaignEvents.occurredAt": "2021-04-09T13:19:25.000", }, { "Events.occurredAt": "2017-01-11T17:29:57.000", "Events.productRef": "Event/201-13", "Events.relatedEntityRefFlat": "Customer/201-5645307", "Events.transactionCurrency": "SEK", "Events.transactionItemCount": "4", "Events.transactionItemPrice": "235.85", "Events.type": "as.commerce.transaction.completed", relatedEventName: "Hammarby-Östersunds FK", }, { "Events.occurredAt": "2018-01-11T17:29:57.000", "Events.productRef": "Event/201-13", "Events.relatedEntityRefFlat": "Customer/201-5645307", "Events.transactionCurrency": "SEK", "Events.transactionItemCount": "2", "Events.transactionItemPrice": "135.85", "Events.type": "as.commerce.transaction.completed", relatedEventName: "Hammarby-Östersunds FK", }, ] arr.sort((a, b) => { const keyA = Object.keys(a).find((key) => key.endsWith('.occurredAt')) const keyB = Object.keys(b).find((key) => key.endsWith('.occurredAt')) const dateA = new Date(a[keyA]) const dateB = new Date(b[keyB]) return dateA - dateB // oldest to newest }) console.log(arr)
注意Array.prototype.sort()
修改了原始數組。 您可以使用例如arr.slice().sort()
首先創建數組的副本,然后對復制的數組進行排序。
如果真的只有兩種可能性,您可以使用 boolean 或從第一種可能性回退到第二種可能性:
const arr = [ { "EmailCampaignEvents.campaignRef": "test6example1", "EmailCampaignEvents.campaignSentAt": "2021-04-09T13:19:24.000", "EmailCampaignEvents.customerRef": "Customer/activityTest10", "EmailCampaignEvents.emailRef": "Email/9374eaee0713f36a247b0d0c863e920b", "EmailCampaignEvents.eventType": "delivery", "EmailCampaignEvents.occurredAt": "2021-04-09T13:19:25.000", }, { "Events.occurredAt": "2017-01-11T17:29:57.000", "Events.productRef": "Event/201-13", "Events.relatedEntityRefFlat": "Customer/201-5645307", "Events.transactionCurrency": "SEK", "Events.transactionItemCount": "4", "Events.transactionItemPrice": "235.85", "Events.type": "as.commerce.transaction.completed", "relatedEventName": "Hammarby-Östersunds FK", }, { "Events.occurredAt": "2018-01-11T17:29:57.000", "Events.productRef": "Event/201-13", "Events.relatedEntityRefFlat": "Customer/201-5645307", "Events.transactionCurrency": "SEK", "Events.transactionItemCount": "2", "Events.transactionItemPrice": "135.85", "Events.type": "as.commerce.transaction.completed", "relatedEventName": "Hammarby-Östersunds FK", }, ]; const result = arr.sort((a,b) => { const aVal = new Date(a["EmailCampaignEvents.occurredAt"] || a["Events.occurredAt"]); const bVal = new Date(b["EmailCampaignEvents.occurredAt"] || b["Events.occurredAt"]); return aVal - bVal; }); console.log(result);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.