tengo un objeto:
let lastPosts = { id1: { date: new Date("10/10/2000 11:30:34"), }, id2: { date: new Date("10/10/2000 10:00:00"), }, id3: { date: new Date("10/10/2000 10:01:30"), }, id4: { date: new Date("11/10/2000 13:09:30"), }, id5: { date: new Date("8/10/2005 18:10:15"), }, id6: { date: new Date("11/10/2000 10:00:11"), }, id7: { date: new Date("10/10/2000 10:00:01"), }, id8: { date: new Date("15/10/2000 11:30:34"), }, id9: { date: new Date("7/10/2002 11:30:34"), }, id10: { date: new Date("8/10/2005 18:10:14"), }, id11: { date: new Date("11/10/2000 10:00:00"), }, };y necesito asegurarme de que "lastPosts" solo contenga 9 publicaciones (elementos), eliminando las publicaciones más antiguas restantes.
function deleteOldestLastPosts(lastPosts) { if (Object.keys(lastPosts).length > 9) { // What can I do here? } }Entonces, que tengo el siguiente resultado:
{ id1: { date: new Date("10/10/2000 11:30:34"), }, id3: { date: new Date("10/10/2000 10:01:30"), }, id4: { date: new Date("11/10/2000 13:09:30"), }, id5: { date: new Date("8/10/2005 18:10:15"), }, id6: { date: new Date("11/10/2000 10:00:11"), }, id8: { date: new Date("15/10/2000 11:30:34"), }, id9: { date: new Date("7/10/2002 11:30:34"), }, id10: { date: new Date("8/10/2005 18:10:14"), }, id11: { date: new Date("11/10/2000 10:00:00"), }, }¿Algunas ideas?
Utilice una cola de prioridad. Javascript no tiene uno incorporado, pero puede encontrar un paquete que lo proporcione o escribir uno desde cero.
Use una cola de prioridad mínima para almacenar los objetos id_n , usando el campo de date como criterio. Tan pronto como el tamaño de la cola sea > 9, elimine el elemento en la parte superior de la cola de prioridad. Luego, tome el id_n de ese elemento eliminado y elimínelo del objeto actual ( lastPosts ).
Al final, tendrá los últimos 9 elementos en la cola de prioridad. Y su objeto ( lastPosts ) tendrá los últimos 9 objetos id_n .
La complejidad del tiempo será O(n log k) , n es el tamaño de lastPosts yk es 9 .
Ordenar todos los valores por fecha. Elimine los 9 elementos más nuevos de esta matriz ordenada, produciendo una matriz de las fechas para eliminar. Luego recorra las propiedades, eliminándolo si está en la matriz.
function deleteOldestLastPosts(lastPosts) { let values = Object.values(lastPosts); if (values.length > 9) { let datesToDelete = values.map(el => el.date).sort((a, b) => a - b); datesToDelete.splice(-9); Object.entries(lastPosts).forEach(([key, { date }]) => { if (datesToDelete.includes(date)) { delete lastPosts[key]; } }); } } let lastPosts = { id1: { date: new Date("10/10/2000 11:30:34"), }, id2: { date: new Date("10/10/2000 10:00:00"), }, id3: { date: new Date("10/10/2000 10:01:30"), }, id4: { date: new Date("11/10/2000 13:09:30"), }, id5: { date: new Date("8/10/2005 18:10:15"), }, id6: { date: new Date("11/10/2000 10:00:11"), }, id7: { date: new Date("10/10/2000 10:00:01"), }, id8: { date: new Date("15/10/2000 11:30:34"), }, id9: { date: new Date("7/10/2002 11:30:34"), }, id10: { date: new Date("8/10/2005 18:10:14"), }, id11: { date: new Date("11/10/2000 10:00:00"), }, }; deleteOldestLastPosts(lastPosts); console.log(lastPosts);Aquí hay una función getlastPosts que:
n elementos del objeto json usando el filter por el índice de entradas La función usa sort , filter y reduce en la matriz Object.entries() del objeto JSON.
let lastPosts = { id1: { date: new Date("10/10/2000 11:30:34"), }, id2: { date: new Date("10/10/2000 10:00:00"), }, id3: { date: new Date("10/10/2000 10:01:30"), }, id4: { date: new Date("11/10/2000 13:09:30"), }, id5: { date: new Date("8/10/2005 18:10:15"), }, id6: { date: new Date("11/10/2000 10:00:11"), }, id7: { date: new Date("10/10/2000 10:00:01"), }, id8: { date: new Date("15/10/2000 11:30:34"), }, id9: { date: new Date("7/10/2002 11:30:34"), }, id10: { date: new Date("8/10/2005 18:10:14"), }, id11: { date: new Date("11/10/2000 10:00:00"), }, }; function getlastPosts(posts, n) { return Object.entries(posts) .sort(([, a], [, b]) => b.date - a.date) .filter((e, i) => i < n) .reduce((r, [k, v]) => ({ ...r, [k]: v }), {}) } // get first 3 elements console.log(getlastPosts(lastPosts, 3));Véase también Ordenar propiedad de objeto por valores