简体   繁体   English

如何按键名对对象数组进行分组?

[英]How to group an array of objects by key name?

I have an array of objects and I want to group them by object's key names.我有一个对象数组,我想按对象的键名对它们进行分组。 I have tried to do this with Array.reduce() , but the result is not good since it's grouped by values.我试图用Array.reduce()来做到这一点,但结果并不好,因为它是按值分组的。 Here is the example of an array I have and example of what I've tried so far这是我拥有的数组示例和到目前为止我尝试过的示例

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

And the result I try to achieve is something like this我试图达到的结果是这样的

{ 
  "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"
    }
  ]
}

Does anyone know how can I achieve this, but not using lodash or any other library?有谁知道我怎样才能做到这一点,但不使用 lodash 或任何其他库? Any example will be appreciated!任何例子将不胜感激!

You could check if the 'Events.type' exists in the object, then take this string as key for the group, otherwise take 'EmailCampaignEvents.eventType' as key.您可以检查 object 中是否存在'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; }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM