Object.fromEntries()

Dr. Axel Rauschmayer

Mikéias Oliveira
Jun 25 · 3 min read

Este capítulo explica o recurso ES2019 “Object.fromEntries()” (por Darien Maillet Valentine).

Object.fromEntries() vs. Object.entries()

Dado um iterável sobre pares de [chave, valor], Object.fromEntries() cria um objeto:

> { foo: 1, bar: 2, }

Faz o oposto de Object.entries():

Object.entries(obj)> [[‘foo’,1], [‘bar’,2]]

Combinando Object.entries() com Object.fromEntries() ajuda na implementação de uma variedade de operações relacionadas a objetos.

Exemplos

Nesta seção, usaremos Object.entries() e Object.fromEntries() para implementarmos diversas funções a partir da biblioteca underscore.js.

_.pick(object, …keys)
pick() remove todas as propriedades do objeto na qual as chaves não estão no parâmetro keys. A remoção não altera o objeto base: pick() cria uma cópia modificada e não altera o original. Por exemplo:

pick(address, 'street', 'number')

> { street: ‘Evergreen Terrace’, number: ‘742’ }

Podemos implementar pick() da seguinte forma:

_.invert(object)
invert() troca as chaves de um objeto por seus respectivos valores sem modificar o objeto original:

> {1: ‘a’, 2: ‘b’, 3: ‘c’}

Podemos implementá-lo assim:

_.mapObject(object, iteratee, context?)
mapObject() é como o método Array.map(), mas para objetos:

> {x: 14, y: 8}

Esta é uma implementação:

_.findKey(object, predicate, context?)
findKey() retorna a chave da primeira propriedade para a qual o valor retorna true:

findKey(address, (value, _key) => value === ‘NT’)

> ‘state’

Podemos implementá-lo da seguinte maneira:

Uma implementação

Object.fromEntries() poderia ser implementado da seguinte forma (algumas verificações foram omitidas):

O polyfill oficial está disponível através do pacote npm object.fromentries.

Mais alguns detalhes sobre Object.fromEntries()

  • Chaves duplicadas: Se você mencionar a mesma chave várias vezes, a última menção “ganha”.
  • Symbols como chaves: apesar de Object.entries() ignorar propriedades cujas chaves são symbols, Object.fromEntries() aceita.
  • Coerção de chaves: as chaves de pares [key, value] são forçadas para chaves de propriedade: valores diferentes de strings e symbols são forçados para strings.
  • Iteradores vs. Arrays:
  • Object.entries() retorna um Array (que é consistente com Object.keys() etc.). Seus pares [key, value] são matrizes de 2 elementos.
  • Object.fromEntries() é flexível: aceita iteráveis (o que inclui Arrays e é consistente com new Map() etc.). Seus pares [key, value] são obrigatórios apenas para objetos que possuem propriedades com as chaves ‘0’ e ‘1’(que inclui matrizes de 2 elementos).
  • Somente propriedades de dados enumeráveis ​​são suportadas: Se você deseja criar propriedades não enumeráveis ​​e/ou propriedades sem dados, é necessário usar Object.defineProperty() ou Object.defineProperties().

Tradução livre do tópico Object.fromEntries() em Exploring ES2018 and ES2019”.