Tengo algunos datos de resultados de consultas como ...
"results": [ { "activityId": "7", "universityId": "23", "studentId": "25", "content": "Add course in cart", "activityType": "chat", "createdAt": "2022-04-10T22:25:29.798Z" }, { "activityId": "6", "universityId": "17", "studentId": "25", "content": "Add course in cart", "activityType": "chat", "createdAt": "2022-04-09T23:48:23.554Z" }, { "activityId": "5", "universityId": "17", "studentId": "25", "content": "Add course in cart", "activityType": "chat", "createdAt": "2022-04-08T23:48:21.841Z" } ]Ahora necesito filtrar los datos como:
[ { title: 2022-04-10 (here createdAt value), value: { "activityId": "5", "universityId": "17", "studentId": "25", "content": "Add course in cart", "activityType": "chat" } } ]Estoy usando nestJS.
const allActivity = []; Promise.all( results.map((value) => { if (allActivity.length <= 0) { const obj = { title: value.createdAt, values: value, }; allActivity.push(obj); } }), );Solo necesito filtrar los datos con este formato o solo necesito completar mi función que he escrito a continuación.
Simplemente puede usar
select * from data where createdAt like '2022-04-10%'La tabla devuelta con esta consulta tendrá el mismo formato que necesita.
Suponiendo que desea agrupar por createdAt por tiempo de recorte.
const results = [{activityId:"6",universityId:"17",studentId:"25",content:"Add course in cart",activityType:"chat",createdAt:"2022-04-09T23:48:23.554Z"},{activityId:"5",universityId:"17",studentId:"25",content:"Add course in cart",activityType:"chat",createdAt:"2022-04-08T23:48:21.841Z"},{activityId:"9",universityId:"11",studentId:"26",content:"Add course in cart",activityType:"chat",createdAt:"2022-04-08T23:48:21.841Z"}]; const map = new Map(); for (const ele of results) { const date = new Intl.DateTimeFormat('en-GB', { dateStyle: 'medium', }).format(new Date(ele.createdAt)); if (map.has(date)) { map.set(date, [ele, ...map.get(date)]); continue; } map.set(date, [ele]); } const output = Object.fromEntries(map.entries()); console.log(output);Puede verificar esta implementación con reduce
const results = [{ "activityId": "7", "universityId": "23", "studentId": "25", "content": "Add course in cart", "activityType": "chat", "createdAt": "2022-04-10T22:25:29.798Z" }, { "activityId": "6", "universityId": "17", "studentId": "25", "content": "Add course in cart", "activityType": "chat", "createdAt": "2022-04-09T23:48:23.554Z" }, { "activityId": "5", "universityId": "17", "studentId": "25", "content": "Add course in cart", "activityType": "chat", "createdAt": "2022-04-08T23:48:21.841Z" }, { "activityId": "8", "universityId": "17", "studentId": "25", "content": "New testing", "activityType": "chat", "createdAt": "2022-04-08T23:48:21.841Z" } ] //format your date from `2022-04-08T23:48:21.841Z` to `2022-04-08` const formatDate = (date) => date.split('T')[0] const finalResult = results .reduce((finalList, item) => { const currentItemFormattedDate = formatDate(item.createdAt) const foundItem = finalList.find(addedItem => formatDate(addedItem.title) === currentItemFormattedDate) //if it's not in the final list, we need to create a new title if (!foundItem) { finalList.push({ title: currentItemFormattedDate, value: [{ ...item }] }) } else { //if it's in the final list, we just need to push value foundItem.value.push({ ...item }) } return finalList }, []) console.log(finalResult) La forma más fácil con groupBy , pero en lugar de title , estoy usando claves para la representación de fechas
const results = [{ "activityId": "7", "universityId": "23", "studentId": "25", "content": "Add course in cart", "activityType": "chat", "createdAt": "2022-04-10T22:25:29.798Z" }, { "activityId": "6", "universityId": "17", "studentId": "25", "content": "Add course in cart", "activityType": "chat", "createdAt": "2022-04-09T23:48:23.554Z" }, { "activityId": "5", "universityId": "17", "studentId": "25", "content": "Add course in cart", "activityType": "chat", "createdAt": "2022-04-08T23:48:21.841Z" }, { "activityId": "8", "universityId": "17", "studentId": "25", "content": "New testing", "activityType": "chat", "createdAt": "2022-04-08T23:48:21.841Z" } ] const formatDate = (date) => date.split('T')[0] //groupBy is not fully supported for all browsers, so I use vanilla Javascript for it const groupBy = function(xs, key) { return xs.reduce(function(rv, x) { (rv[x[key]] = rv[x[key]] || []).push(x); return rv; }, {}); }; const finalResult = groupBy(results.map(item => ({...item, createdAt: formatDate(item.createdAt)})), "createdAt") console.log(finalResult)