在 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 中“分组”对象数组的最佳方式?的主要内容,如果未能解决你的问题,请参考以下文章