Criando Array de forma marota com ES6

Esses dias vi um tweet do Eric Elliott de como criar um Array de forma marota com ES6, olhe só:

Agora me diga se isso não parece mágica?

const range = (start, end) => (  
  Array.from({ length: end - start + 1 }, (x, i) => i + start)
);

Usando assim:

> range(1, 4)
[ 1, 2, 3, 4 ]
> range(6, 11)
[ 6, 7, 8, 9, 10, 11 ]

Você deve ter notado que ele utiliza Array.from então vamos ver o que a MDN tem a nos dizer:

O método Array.from() cria uma nova instânica de um Array quando for passado um array-like ou um iterable object como argumento.

E logo abaixo vemos qual é sua sintaxe:

Array.from(arrayLike[, mapFn[, thisArg]])

Continuando na página encontramos a parte dos exemplos e o último exemplo demonstrado é esse:

// Gerando uma sequência de números
Array.from({length: 5}, (v, k) => k);  
// [0, 1, 2, 3, 4]

Sabendo disso fiz uma pequena modificação para ele gerar o Arrray com valores aleatórios utilizando um módulo do npm que eu criei para isso baseado no artigo anterior sobre refatoração.

O qual me fez refatorar meu módulo para gerar Arrays com valores de forma atômica, ficando assim:

const atomicArray = (length, create) => Array.from({ length }, create)  
module.exports = { atomicArray }  

Módulo atomic-array no npm

Onde:

  • length: tamanho do Array gerado
  • create: função para criação dos valores no Array.

Por exemplo se quisermos criar um Array com valores randômicos de 99 até 777?

atomicArray.create(10, () => Math.floor(Math.random() * (777 - 99)) + 99)  

Também fiz 3 testes simples para validar o código com mocha e chai.expect

const expect = require('chai').expect  
const create = require('./atomicArray')

describe('atomicArray', () => {  
  const testNameTruey = 'a create function is needed!'
  describe(testNameTruey,  () => {
    it('testing if '+testNameTruey, () => {
      try {
        create.atomicArray(10)
      } catch(e) {
        expect(e).to.be.an('error')
      }
    })
  })
  const testNameLength = 'the length of returned Array'
  describe(testNameLength,  () => {
    it('testing if '+testNameLength+' is equal to 10', () => {
      expect(create.atomicArray(10, ()=>0).length).to.equal(10)
    })
  })
  const testNameValues = 'the values of returned Array'
  describe(testNameValues,  () => {
    it('testing if '+testNameValues+' is equal to 0', () => {
      const _arr = create.atomicArray(10, ()=>0)
      _arr.forEach( (element, index) => {
        expect(element).to.equal(0)
      })
    })
  })

Você pode clonar o repositório no github e rodar os testes com:

npm test  

E aí curtiu essa dica marota?

Então fique esperto que essa semana sai o vídeo sobre esse assunto com mais exemplos com Array.from!

Comentários

comments powered by Disqus