首页 > 解决方案 > 如何按键名对对象数组进行分组?

问题描述

我有一个对象数组,我想按对象的键名对它们进行分组。我试图用 来做到这一点Array.reduce(),但结果并不好,因为它是按值分组的。这是我拥有的数组示例和到目前为止我尝试过的示例

const rawData = [
    {
    "EmailCampaignEvents.campaignRef": "my-first-campaign",
    "EmailCampaignEvents.customerRef": "Customer/0",
    "EmailCampaignEvents.emailRef": "Customer/0",
    "EmailCampaignEvents.eventType": "initial_open",
    "EmailCampaignEvents.occurredAt": "2021-02-25T14:03:04.000"
  },
  {
    "EmailCampaignEvents.campaignRef": "my-second-campaign",
    "EmailCampaignEvents.customerRef": "Customer/123",
    "EmailCampaignEvents.emailRef": "Customer/123",
    "EmailCampaignEvents.eventType": "delivery",
    "EmailCampaignEvents.occurredAt": "2021-03-25T14:03:04.000"
  },
  {
    "Events.occurredAt": "2020-11-11T15:44:07.000",
    "Events.relatedEntityRefFlat": "Customer/6711684",
    "Events.type": "as.commerce.transaction.completed"
  }
];

result = rawData.reduce(function (r, a) {
        r[a["EmailCampaignEvents.eventType"]] = r[a["EmailCampaignEvents.eventType"]] || [];
        r[a["EmailCampaignEvents.eventType"]].push(a);
        r[a["Events.type"]] = r[a["Events.type"]] || [];
        r[a["Events.type"]].push(a);
        return r;
    }, Object.create(null));

console.log(result);

我试图达到的结果是这样的

{ 
  "EmailCampaignEvents.eventType": [
    {
      "EmailCampaignEvents.campaignRef": "my-first-campaign",
      "EmailCampaignEvents.customerRef": "Customer/0",
      "EmailCampaignEvents.emailRef": "Customer/0",
      "EmailCampaignEvents.eventType": "initial_open",
      "EmailCampaignEvents.occurredAt": "2021-02-25T14:03:04.000"
    },
    {
      "EmailCampaignEvents.campaignRef": "my-second-campaign",
      "EmailCampaignEvents.customerRef": "Customer/123",
      "EmailCampaignEvents.emailRef": "Customer/123",
      "EmailCampaignEvents.eventType": "delivery",
      "EmailCampaignEvents.occurredAt": "2021-03-25T14:03:04.000"
    },
  ],
  "Events.type": [
    {
      "Events.occurredAt": "2020-11-11T15:44:07.000",
      "Events.relatedEntityRefFlat": "Customer/6711684",
      "Events.type": "as.commerce.transaction.completed"
    }
  ]
}

有谁知道我怎样才能做到这一点,但不使用 lodash 或任何其他库?任何例子将不胜感激!

标签: javascriptarraysobjectecmascript-6

解决方案


您可以检查'Events.type'对象中是否存在,然后将此字符串作为组的键,否则'EmailCampaignEvents.eventType'作为键。

const
    rawData = [{ "EmailCampaignEvents.campaignRef": "my-first-campaign", "EmailCampaignEvents.customerRef": "Customer/0", "EmailCampaignEvents.emailRef": "Customer/0", "EmailCampaignEvents.eventType": "initial_open", "EmailCampaignEvents.occurredAt": "2021-02-25T14:03:04.000" }, { "EmailCampaignEvents.campaignRef": "my-second-campaign", "EmailCampaignEvents.customerRef": "Customer/123", "EmailCampaignEvents.emailRef": "Customer/123", "EmailCampaignEvents.eventType": "delivery", "EmailCampaignEvents.occurredAt": "2021-03-25T14:03:04.000" }, { "Events.occurredAt": "2020-11-11T15:44:07.000", "Events.relatedEntityRefFlat": "Customer/6711684", "Events.type": "as.commerce.transaction.completed" }],
    result = rawData.reduce((r, o) => {
        const key = 'Events.type' in o
            ? 'Events.type'
            : 'EmailCampaignEvents.eventType';
            
        (r[key] ??= []).push(o);
        return r;
    }, Object.create(null));

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


推荐阅读