簡體   English   中英

屬性不同時如何按日期對對象數組進行排序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM