Função recursiva tentando replicar o flat() do js

10/10/2020

7

Oi estou estudando js e tentando recriar algumas das funções nativas da linguagens como o flat():
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array/flat

Não exatamente como na linguagem é claro, estou fazendo de uma forma para meu aprendizado, nesse caso criei o newFLat, que pelo menos nesse primeiro momento estou tentando criar um função recursiva finita.
Depois de resolver esse, farei o outro caso, onde vai ter o Math.Infinity quando for Infinity, o algoritmo muda.

No console:
newFlat([1,2,[3,4]], 2)
(4) [1, 2, 3, 4]

newFlat([1,2,[3,4,[5,6,7]]], 3)
(5) [1, 2, 3, 4, Array(3)]

Meu algorítimo só funciona ate 2 arrays aninhados, a partir de 3 ele adiciona os outros arrays aninhados no ultimo elemento, o que não deveria ocorrer.

O proposito do exercício que dado um array que dentro dele há varios outros arrays um dentro do outro, e usando o newFlat, o retorno seria um novo array com todos os elementos do outros arrays destrinchados e ordenados.

Tentei o usar o spread, que no caso seria array[index] com os 3 pontos: resultado.push(...array[index]):
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Operators/Spread_operator

Pelo menos funciona para destrinchar o array interno para ser adicionado no array externo.

Você pode me ajudar resolver esse com parâmetro finito?

const newFlat = (array, numeroArrayUnir) => {
let resultFlat = []
let interacao = 1
if(!Number.isNaN(numeroArrayUnir)){
interacao = numeroArrayUnir
}

const recursive = (array, interacao) => {
if(interacao > 0){
array.forEach(element => {
if(Array.isArray(element)){
resultFlat.push(...element)
interacao -= 1
recursive(element, interacao)
}else{
resultFlat.push(element)
interacao -= 1
}
});

}
return resultFlat
}
return recursive(array, interacao)
}
Ferreira

Ferreira

Responder

Posts

10/10/2020

Ferreira

Consegui! uhuhu

const newFlat = (array, numeroArrayUnir) => {
let resultFlat = []
let interacao = 1
let result

const recursiveFinito = (array, interacao) => {
if(interacao > 0){
resultFlat = []
array.forEach(element => {
if(Array.isArray(element)){
resultFlat.push(...element)
}else{
resultFlat.push(element)
}
});
interacao -= 1
recursiveFinito(resultFlat, interacao)

}
return resultFlat
}

if(!Number.isNaN(numeroArrayUnir)){
interacao = numeroArrayUnir
result = recursiveFinito(array, interacao)
}

return result
}
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários,
consulte nossa política de privacidade.

Aceitar