Turn objects into arrays of key–value pairs and unlock powerful patterns for iteration, transformation, and real-world dev workflows.

Introduction
Ever tried to loop through an object and ended up writing something clunky like this?
for (const key in obj) {
if (obj.hasOwnProperty(key)) {
console.log(key, obj[key]);
}
}
That’s old-school. Since ES2017, JavaScript gave us Object.entries
—a clean, reliable way to get an array of [key, value]
pairs from an object.
const obj = { a: 1, b: 2 };
console.log(Object.entries(obj));
// [['a', 1], ['b', 2]]
Now you can use array methods like map
, filter
, and reduce
directly on objects. This post shows how to use Object.entries
for everything from filtering configs to transforming data into arrays, and even building React components dynamically.
1. The Basics
const user = { id: 1, name: "Ali" };
console.log(Object.entries(user));
// [['id', 1], ['name', 'Ali']]
👉 Output is always an array of [key, value]
pairs.
👉 Only own, enumerable string keys are included (no prototype properties, no symbols).
2. Iterating Over Objects
Before:
const settings = { darkMode: true, version: 2 };
for (const key in settings) {
if (settings.hasOwnProperty(key)) {
console.log(key, settings[key]);
}
}
After:
for (const [key, value] of Object.entries(settings)) {
console.log(key, value);
}
👉 Shorter, safer, and works great with destructuring.
3. Transforming Objects with map
const prices = { apple: 1, banana: 2, cherry: 3 };
const labels = Object.entries(prices).map(
([fruit, price]) => `${fruit}: $${price}`
);
console.log(labels);
// ['apple: $1', 'banana: $2', 'cherry: $3']
👉 Converts object data into arrays for rendering or further processing.
4. Filtering Objects
const env = { NODE_ENV: "production", DEBUG: false, API_URL: "..." };
const filtered = Object.fromEntries(
Object.entries(env).filter(([k, v]) => v !== false)
);
console.log(filtered);
// { NODE_ENV: 'production', API_URL: '...' }
👉 Combine with Object.fromEntries
for elegant transformations.
5. Reducing to New Structures
const scores = { Ali: 90, Umar: 75, Laiba: 85 };
const average =
Object.entries(scores).reduce((sum, [, score]) => sum + score, 0) /
Object.keys(scores).length;
console.log(average); // 83.33
👉 entries
+ reduce
= powerful numeric aggregations.
6. Swapping Keys & Values
const obj = { a: 1, b: 2, c: 3 };
const flipped = Object.fromEntries(
Object.entries(obj).map(([k, v]) => [v, k])
);
console.log(flipped); // { '1': 'a', '2': 'b', '3': 'c' }
👉 Useful for lookup tables or reversing maps.
7. Working with Dynamic Data
Example: Render a table in React
const user = { id: 1, name: "Ali", role: "admin" };
function UserTable({ data }) {
return (
<table>
<tbody>
{Object.entries(data).map(([k, v]) => (
<tr key={k}>
<td>{k}</td>
<td>{v}</td>
</tr>
))}
</tbody>
</table>
);
}
👉 Quickly render key–value pairs without manual loops.
8. Converting Between Objects & Maps
const obj = { a: 1, b: 2 };
const map = new Map(Object.entries(obj));
console.log(map.get('a')); // 1
And back:
const backToObj = Object.fromEntries(map);
👉 Perfect when you need ordered keys, iteration, or performance of Map
.
9. Real-World Use Cases
- Filtering API payloads: Remove null/undefined values.
- Feature flags: Enable/disable based on dynamic conditions.
- CSV export: Turn objects into row arrays.
- Localization: Convert translation objects into
Map
s for faster lookup. - React forms: Render form fields from config objects.
10. TypeScript Patterns
A) Strongly typed iteration
type User = { id: number; name: string };
const user: User = { id: 1, name: "Ali" };
for (const [key, value] of Object.entries(user) as [keyof User, User[keyof User]][]) {
console.log(key, value);
}
👉 TypeScript otherwise sees string
/any
. Explicit typing fixes that.
B) Safer filters
function filterObject<T extends object>(
obj: T,
predicate: (key: keyof T, value: T[keyof T]) => boolean
): Partial<T> {
return Object.fromEntries(
Object.entries(obj).filter(([k, v]) =>
predicate(k as keyof T, v as T[keyof T])
)
) as Partial<T>;
}
11. Edge Cases & Gotchas
- Symbols are skipped —
Object.entries
only uses string keys. UseObject.getOwnPropertySymbols
if you need symbols. - Prototype props not included — only own properties.
- Order:
Object.entries
respects insertion order (likeObject.keys
). - Performance: Fine for normal objects. For very large data or frequent mutations, consider
Map
.
Conclusion
Object.entries
turns objects into array-friendly data. That means you can use the full arsenal of map
, filter
, reduce
, and other array utilities on objects.
- Cleaner iteration.
- Elegant transformations with
Object.fromEntries
. - Direct bridges to
Map
and React rendering.
Pro Tip: When you find yourself writing a for...in
loop with hasOwnProperty
, switch to Object.entries
+ modern array methods—it’s cleaner, safer, and more expressive.
Call to Action (CTA)
What’s your favorite Object.entries
trick—filtering configs, rendering React tables, or building Maps?
Drop it in the comments, and share this with a teammate who still writes for...in
loops.
Leave a Reply