javascript - 如何按键名对对象数组进行分组?
问题描述
我有一个对象数组,我想按对象的键名对它们进行分组。我试图用 来做到这一点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 或任何其他库?任何例子将不胜感激!
解决方案
您可以检查'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; }
推荐阅读
- c++ - AWS 使用 QT 5 执行 API 请求
- pdf - Forge 查看器,PDF 镜像
- c# - 将托管 asp 核心记录为 Windows 服务时出错
- sql - SQL 上的平均时间
- php - 在订单电子邮件 woocommerce 中添加新添加的帐单地址和送货地址字段
- pandas - 将附加信息(数据)附加到数据框列值
- json - 验证架构属性时,没有带有键的架构或带有 AJV 的引用
- javascript - 为什么用户加入房间时视频不显示?
- reactjs - react-table 从数据中的多个电子邮件地址获取默认电子邮件地址(打字稿)
- python - Python 请求/httpx 响应和垃圾收集