Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Javascript - Remove oldest elements of a map (object)

I have an object:

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"),
  },
};

and I need to ensure that "lastPosts" only contains 9 posts (elements), deleting the remaining oldest posts.

function deleteOldestLastPosts(lastPosts) {
    if (Object.keys(lastPosts).length > 9) {
       // What can I do here?
    }
}

So, that I have the following result:

{
  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"),
  },
}

Any ideas?

like image 343
Raul Avatar asked Feb 26 '26 14:02

Raul


1 Answers

Sort all the values by date. Remove the newest 9 elements from this sorted array, producing an array of the dates to delete. Then loop through the properties, removing it if it's in the array.

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);
like image 120
Barmar Avatar answered Mar 01 '26 03:03

Barmar



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!