【问题标题】:How to sort array of objects by date when the property is different属性不同时如何按日期对对象数组进行排序
【发布时间】:2021-07-15 15:03:17
【问题描述】:

我有一个对象数组,我想按日期对其进行排序(在这种情况下,它是名称中带有 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",
  },
];

请注意,在第一个对象中我有EmailCampaignEvents.occurredAt,在其余两个中我有一个类似Events.occurredAt 的属性。是否可以以某种方式对该数组进行排序?任何示例将不胜感激!

【问题讨论】:

    标签: javascript arrays object ecmascript-6


    【解决方案1】:

    问题的症结在于存储occurredAt日期值的对象的变量键名,您可以定义自定义方法通过检查每个对象键中的substring来获取值。

    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);
    })
    

    这将解决您的问题,但如果可能的话,我绝对建议为所有对象的相同数据使用一致的键名。

    【讨论】:

      【解决方案2】:

      如果真的只有两种可能性,您可以只使用布尔值或从第一种可能性回退到第二种可能性:

      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);

      【讨论】:

      • 三个答案都很好,但这个最适合我的代码结构。感谢您的努力!
      【解决方案3】:

      Array.prototype.sort() 与自定义排序功能一起使用。您可以使用Object.keys() 查找以.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() 先创建数组的副本,然后对复制的数组进行排序。

      【讨论】:

        猜你喜欢
        • 2012-04-24
        • 1970-01-01
        • 2023-03-22
        • 1970-01-01
        • 2013-10-26
        • 1970-01-01
        • 2021-03-29
        相关资源
        最近更新 更多