# Object.entries() and Object.values() methods in JavaScript

By Atta Ur Rehman Shah (https://attacomsian.com/about). Published Aug 18, 2019, updated Sep 19, 2022. Topics: JavaScript.
Canonical URL: https://attacomsian.com/blog/object-entries-values-javascript

> An introduction to ES8's Object.entries() and Object.values() methods and how to use them in JavaScript.

The `Object.entries()` and `Object.values()` methods were added to the JavaScript object constructor with the release of ECMAScript 2017 (ES8). 

Let us have a quick look at these useful methods.

## `Object.entries()` Method

The `Object.entries()` method takes an [object](https://attacomsian.com/blog/objects-prototypes-classes-javascript#objects) as argument and returns an array with arrays of key-value pairs:

```javascript
const birds = {
  owl: '?',
  eagle: '?',
  duck: '?'
}

const entries = Object.entries(birds)
console.log(entries)

// [['owl', '?'], ['eagle', '?'], ['duck', '?']]
```

The order of the array element does not depend on how the object was defined. The order is the same as that provided by a `for...in` loop.

### Iterate over an object

The `Object.entries()` method can be used to [iterate over an object](https://attacomsian.com/blog/javascript-iterate-objects#objectentries-method):

```javascript
// using `for...of` loop
for (const [key, value] of Object.entries(birds)) {
  console.log(`${key}: ${value}`)
}

// owl: ?
// eagle: ?
// duck: ?

// using array destructuring
Object.entries(birds).forEach(([key, value]) => console.log(`${key}: ${value}`))

// owl: ?
// eagle: ?
// duck: ?
```


### Convert an object to a `Map`

Since the [`Map` constructor](https://attacomsian.com/blog/maps-javascript#initialize-a-map) takes an iterable to initialize a map object, the `Object.entries()` method can be used to create a map from an object:

```java
const map = new Map(Object.entries(birds))

console.log(map.size)           // 3
console.log(map.has('owl'))     // true
console.log(map.get('duck'))    // ?
```

## `Object.values()` Method

The `Object.values()` method, unlike `Object.entries()`, only returns the values of the own enumerable string-keyed properties in the same order as provided by the [`for...in`](https://attacomsian.com/blog/for-in-loop-in-javascript) loop:

```javascript
const foods = {
  cake: '?',
  pizza: '?',
  candy: '?',
  icecream: '?'
}

const values = Object.values(foods)
console.log(values)

// ['?', '?', '?', '?']
```

Both `Object.values()` and `Object.entries()` do not follow the prototype chain and only iterate through the properties directly added to the given object. 

They also ignore all non-enumerable properties:

```javascript
Object.defineProperty(foods, 'sushi', {
  value: '?',
  writable: true,
  configurable: true,
  enumerable: false
})

console.log(Object.values(foods))

// ['?', '?', '?', '?']
```

### Convert an object to a `Set`

Since the [`Set` constructor](https://attacomsian.com/blog/sets-javascript#initialize-a-set) accepts an iterable, with `Object.values()`, we can easily convert an object to a `Set`:

```javascript
const set = new Set(Object.values(foods))

console.log(set.size)       // 4
console.log(set.has('?'))  // true
```
