Achatar um array

Crie uma função que receba um array. Esse array pode conter todos os tipos de itens, até mesmo outros arrays. A função deve retornar um único array plano e unidimensional com todos os elementos. Estas são as condições:

  1. Se o item for um Array, inclua cada item contido nele, e as regras a seguir continuarão se aplicando:
  2. Se o item for uma Function, inclua o resultado da função, não a própria função.
  3. Se o item for um Object simples ou um Primitive, inclua-o como está.

Exemplos

flattenArray([1, "2", [3, function () { return 4; }, [ "five" ], "six", true, { prop: "val" }]])
➞ [1, "2", 3, 4, "five", "six", true, { prop: "val" }]

flattenArray([1, 2, [3, [4, 5], 6], 7, 8]) ➞ [1, 2, 3, 4, 5, 6, 7, 8]

flattenArray() ➞ []

Observações

Se nenhuma entrada for fornecida, deve retornar um array vazio: [].