DEV Community

Jack
Jack

Posted on

Object.entries is awesome

Somebody asks you to loop through the properties of an object, most of us will reach for Object.keys right?

Object.keys(obj).forEach(key => { const value = obj[key]; // do something }) 
Enter fullscreen mode Exit fullscreen mode

Somebody asks you to map the properties of an object to other values. Object.keys to the rescue again right?

const newObj = {}; Object.keys(obj).forEach(key => { newObj[key] = fn(obj[key]); }); 
Enter fullscreen mode Exit fullscreen mode

Wait, no reduce? That's so 2018! Let's be needlessly functional:

const newObj = Object.keys(obj).reduce((acc, key) => { return { ...acc, [key]: fn(obj[key]) }, {}); 
Enter fullscreen mode Exit fullscreen mode

Nice!

Thing is, Object.entries and Object.fromEntries are now widely supported. You can now achieve the same thing like this:

const newObj = Object.fromEntries( Object.entries(obj).map([key, value]) => { return [key, fn(value)]; }) ); 
Enter fullscreen mode Exit fullscreen mode

It's also trivial to just make a utility function that combines the fromEntries and entries calls:

const mapEntries = (obj, fn) => Object.fromEntries( Object.entries(obj).map(fn) ); 
Enter fullscreen mode Exit fullscreen mode

you could then write the above like this:

const newObj = mapEntries(obj, ([key, value]) => [key, fn(value)]); 
Enter fullscreen mode Exit fullscreen mode

I love how simple this is, and you can do so much stuff that's always been a bit of a pain before.

Want to transform keys?

const newObj = mapEntries(obj, [key, value]) => [fn(key), value]); 
Enter fullscreen mode Exit fullscreen mode

Want to invert an object?

const inverted = mapEntries(obj, ([key, value]) => [value, key]); 
Enter fullscreen mode Exit fullscreen mode

Want to filter properties out of an object?

const filtered = Object.fromEntries( Object.entries(obj).filter(([ , value]) => { return value === true; }) ); 
Enter fullscreen mode Exit fullscreen mode

Object.entries is awesome, have a play with it.

Top comments (0)