spłaszczenie tablicy

0

Cześć, piszę sobie skrypty na freecodecamp i tam mam zadanie spłaszczyć tablicę w ten sposób:

steamrollArray("a", "b"]) should return ["a", "b"].
steamrollArray([1, [2], [3, 4]]) should return [1, 2, 3, 4].
steamrollArray([1, [], [3, 4]]) should return [1, 3, 4].
steamrollArray([1, {}, [3, 4]]) should return [1, {}, 3, 4].

W linkach pomocniczych dali mi że mogę użyć Array.isArray(). Wiem, że mogę użyć reduce ale chciałem sam napisać tą funkcję. Problem jest taki, że nie mogę użyć żadnej zmiennej poza funkcją a nie wiem jak można byłoby zmienić moją funkcję aby nie było globalnej. Ewentualnie zrobić funkcję w funkcji ale nie wiem czy to ładne rozwiązanie?

var a = [];
function steamrollArray(arr, i = 0) {
  var array = arr[i];
    
  if (Array.isArray(array)) 
    {
              
         steamrollArray(array,0);
                
    }
  else if (array !== undefined) a.push(array);
  if (arr[++i] !== undefined) steamrollArray(arr, i);
  return a;
  
}

console.log(steamrollArray([1, [2], [3, [[4]]]]));

3

nie wiem jak można byłoby zmienić moją funkcję aby nie było globalnej

Rekurencją - spłaszczanie tablicy to jedno z typowych zadań, które w taki sposób można rozwiązać.

1

@quarhodron: A czemu nie chcesz używać reduca? To jedno z ładniejszych rozwiązań imho.

const steamrollArray = arr =>
  arr.reduce((result, item) => Array.isArray(item) ? [...result, ...steamrollArray(item)] : [...result, item], [])

lub

const steamrollArray = arr =>
  arr.reduce((result, item) => [...result, ...(Array.isArray(item) ? steamrollArray(item) : [item]), [])
0

Spróbuj zaimplementować własnego reduce'a. Jest to dość łatwe, a pozwoli Ci lepiej zrozumieć jak działa pod spodem. :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1