[자바스크립트/알고리즘] flat 함수 대안
728x90

flat() 함수란?

 

[자바스크립트] flat() 함수-중첩된 배열 구조 하나로 합치기

정의 flat() 메서드는 모든 하위 배열 요소를 지정한 깊이까지 재귀적으로 이어붙인 새로운 배열을 생성합니다. 구문 const newArr = arr.flat([depth]) 예시 const arr1 = [1, 2, [3, 4]]; arr1.flat(); // [1, 2..

breathtaking-life.tistory.com

지난번 flat() 함수를 이용하면 중첩된 배열 구조를 하나로 바꿀 수 있다고 하였다.

 

이번 문제는 flat함수를 사용하지 않고 대안을 만들어야 한다.

문제

중첩된 배열을 평평하게(flatten) 만들어라.

 

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

 

나의 풀이

function insteadOfFlat(arr) {
  let result = String(arr).replace(",,", ",").split(",");

  return result.map((v) => {
    if(v == '[object Object]') return {};
    else if(isNaN(v)) return v; //문자열일 경우
    else return parseInt(v);
  })
}

작명 센스가 좋지 않아 함수 이름을 좋게 짓지 못했다.

아무튼 flat() 함수 대신에 배열을 문자열로 변환시키고 ,를 기준으로 나누었다(split).

그 후 result안 요소 하나씩 살펴보며 조건문을 검사한다.

 

다른 풀이

function insteadOfFlat(arr) {
  let flat = [].concat(...arr);
  return flat.some(Array.isArray) ? steamrollArray(flat) : flat;
}

 

MDN을 살펴보면 flat() 함수의 대안으로 밑에 코드가 있다.

const flattened = arr => [].concat(...arr);

하지만 이는 중첩 배열을 완벽하게 평평하게(flatten) 하진 못 한다.

([1, [2], [3, [[4]]]] -> [ 1, 2, 3, [ [ 4 ] ] ])

 

그렇기에 3번째 줄을 추가하여 재귀적으로 문제를 해결하게 만들었다.

(forum.freecodecamp.org/t/freecodecamp-challenge-guide-steamroller/16079)

 

Intermediate Algorithm Scripting: Steamroller

(문제 출처:www.freecodecamp.org)

320x100