Object.fromEntries closes the loop with Object.entries

Object.entries has existed since ES2017 and there was no way back, so any transformation of an object went through a reduce that nobody enjoys reading.

// before
const upper = Object.entries(obj).reduce((acc, [k, v]) => {
  acc[k] = v.toUpperCase();
  return acc;
}, {});

// ES2019
const upper = Object.fromEntries(
  Object.entries(obj).map(([k, v]) => [k, v.toUpperCase()])
);

// and the one that comes up constantly
Object.fromEntries(new URLSearchParams(location.search));

The URLSearchParams case is worth memorising on its own — it replaces every hand-rolled query string parser. It accepts any iterable of pairs, so a Map converts directly. The caveat is that duplicate keys collapse to the last value, which for a query string with repeated parameters loses data silently; that is the one case where the manual loop is still correct.