Javascript 循环并映射数组中的对象和按值分组

Javascript 循环并映射数组中的对象和按值分组,javascript,reactjs,ecmascript-6,Javascript,Reactjs,Ecmascript 6,我试图通过创建活动的销售人员在我的数据中对活动进行分组,但使用不同的JS数组方法继续循环 我已经过滤了我的主数据集,以返回那些具有销售人员用户角色的数据集 我有我的活动数据,显示谁创建了这些活动 我现在必须按销售人员对它们进行分组 在我看来,我将其视为活动数组中每个活动对象的循环/映射,检查createdBy名称并返回一个新的对象数组,该数组的结果按createdBy名称分组 在我的脑海里听起来很容易,但无法回避 我总结了以下几点: const filtered=usersData.filter

我试图通过创建活动的销售人员在我的数据中对活动进行分组,但使用不同的JS数组方法继续循环

我已经过滤了我的主数据集,以返回那些具有销售人员用户角色的数据集

我有我的活动数据,显示谁创建了这些活动

我现在必须按销售人员对它们进行分组

在我看来,我将其视为活动数组中每个活动对象的循环/映射,检查createdBy名称并返回一个新的对象数组,该数组的结果按createdBy名称分组

在我的脑海里听起来很容易,但无法回避

我总结了以下几点:

const filtered=usersData.filter((val)=>val.role=='sales');
//这将以以下格式仅返回所有可能用户角色中的销售人员:
主动:正确
创建日期:“2019-04-11T21:00:00.000Z”
电子邮件:“eliana@example.com"
姓名:“亚历山大·汤姆·琼斯”
电话:3044283743
角色:“销售”
_id:“5c8a20d32f8fb814b56fa187”
//我的活动数据包含销售人员的姓名:
预算:57154564
公司:“销售公司”
创建日期:“2020-07-30T09:03:51.925Z”
创建人:“销售用户”
创建者id:“5f228c8d58769fc7d556a6fa”
结束日期:“2020-11-08T00:00:00.000Z”
删除:错误
地点:“赫尔辛基”
名称:“销售测试活动”
//使用此功能,我可以逐个返回销售人员创建的所有活动:
const filteredCampaigns=活动数据.filter(
(val)=>val.createdBy===“销售用户”
);
我就是不知道如何“循环”每个销售人员


我已经看过map/reduce和groupby解决方案,但没有一个能与之相提并论。哪里出错了?

对于按属性分组,您通常希望在如下模式中使用:

const bySalesPerson = campaignData.reduce((records, record) => {
  // get the property to group by, replace with the
  // actual property name you want (createdBy?)
  const { salesPerson } = record;

  // check if it exists in our accumulator object, if not
  // assign empty array
  if (!(salesPerson in records)) records[salesPerson] = [];

  // push current record into the array associated with
  // that value of the property, in this case a particular
  // sales person
  records[salesPerson].push(record);

  // return the accumulator object from the callback
  return records; 
}, {});

您可以使用此方法按销售用户分组。只需像这样调用此方法:
constgrouped=groupBy(活动数据,['createdBy'])


假设数组包含对象,则可以使用过滤器功能

const活动数据=[{
预算:57154564,
公司:“销售公司”,
创建日期:“2020-07-30T09:03:51.925Z”,
createdBy:“销售用户”,
创建者id:“5f228c8d58769fc7d556a6fa”,
结束日期:“2020-11-08T00:00:00.000Z”,
isDeleted:错,
地点:“赫尔辛基”,
名称:“销售测试活动”
},
{
预算:10,
公司:“销售公司”,
创建日期:“2020-07-29T09:03:51.925Z”,
createdBy:“购买用户”,
创建者id:“5f228c8d58769fc7d556a6fb”,
结束日期:“2020-12-08T00:00:00.000Z”,
isDeleted:错,
地点:“斯德哥尔摩”,
名称:“销售测试活动”
}
];
const filteredCampaigns=活动数据.filter(
职能(项目){
return item.createdBy==“销售用户”;
}
);

console.log(filteredCampaigns)这将创建一个嵌套数组,但通常在按属性分组时,您希望能够通过传递属性值(即在属性值上散列的对象中)来获取所有记录。这正是我所需要的。谢谢你的详细回复。也帮助我理解了很多解决方案。
groupBy(xs, key) {
        return xs.reduce((rv, x) => {
            const v = x[key];
            const el = rv.find((r) => r && r.key === v);
            if (el) {
                el.values.push(x);
            } else {
                rv.push({
                    key: v,
                    values: [x]
                });
            }
            return rv;
        }, []);
    }