在 ES6 JS 中“分组”对象数组的最佳方式?

Posted

技术标签:

【中文标题】在 ES6 JS 中“分组”对象数组的最佳方式?【英文标题】:Best Way to "Group By" an Array of Objects in ES6 JS? 【发布时间】:2022-01-24 01:35:46 【问题描述】:

我正在学习 JS,并且从 SQL 的背景来看,我试图了解在对象数组上模拟“分组依据”查询的最佳方法。例如,我想返回尚未完成的最新“任务”。 ES6 Map 功能可以实现吗?

[

    "id": 581337,
    "date_due": "2021-10-04",
    "task": "Client Billing Activity Review",
    "is_completed": 1,
,

    "id": 581338,
    "date_due": "2021-12-10",
    "task": "Client Billing Activity Review",
    "is_completed": 0,
,

    "id": 581339,
    "date_due": "2022-01-09",
    "task": "Client Billing Activity Review",
    "is_completed": 0,
,

    "id": 581340,
    "date_due": "2022-04-10",
    "task": "Client Billing Activity Review",
    "is_completed": 0,

]

在 SQL 中,我的查询是:

select task, min(date_due) as next due_date
from table
where date_due > today()
and is_completed = 0
group by task

这里的 JS 沙箱:https://parsebox.io/jamieroyce/tmbghkcyfwkh

【问题讨论】:

对对象数组进行分组有很多问题。请展示您的研究成果 (***.com/search?q=javascript+array+group+by) 【参考方案1】:

我能找到的最干净的解决方案是:创建一个字典,过滤掉任何不需要的记录,循环遍历字典并将任务保留在下一个最接近的日期:

const dict = ;
input.filter(n => n.is_completed === 0 && new Date(n.date_due) - new Date() > 0)
.forEach(n => 
    dict[n.task] = dict[n.task] || n;
    if (new Date(dict[n.task].date_due) < new Date(n.date_due)) 
      dict[n.task] = n;
    
);
return dict;

【讨论】:

以上是关于在 ES6 JS 中“分组”对象数组的最佳方式?的主要内容,如果未能解决你的问题,请参考以下文章

ES6对象的新增方法

如何在js中对数组中的数据进行分组

Airbnb Javascript 代码规范重要点总结es6

ES6方式 - 按键从嵌套数组中获取唯一值

ES6 解构赋值

ES6数组扩展