Estoy aprendiendo JS y desde un fondo en SQL estoy tratando de entender la mejor manera de simular una consulta "Agrupar por" en una matriz de objetos. Por ejemplo, quiero devolver la "Tarea" más reciente que aún no se ha completado. ¿Es esto posible con la función de mapa ES6?
[ { "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, } ]En SQL mi consulta sería:
select task, min(date_due) as next due_date from table where date_due > today() and is_completed = 0 group by taskSandbox de JS aquí: https://parsebox.io/jamieroyce/tmbghkcyfwkh
La solución más limpia que pude encontrar para hacer esto es: Cree un diccionario, filtre los registros que no sean necesarios, recorra el diccionario y mantenga la tarea con la siguiente fecha más cercana:
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;