멀티 라인 스트링에서, 각 라인 앞쪽에 공통으로 존재하는 공백 스트링을 제거해야 할 때가 있다.

예를 들면

	const a = [1, 2, 3];
	for(const x in a) {
		console.log(x)
	}

위 텍스트 블럭을 아래처럼 만드는 작업을 할 경우.

const a = [1, 2, 3];
for(const x in a) {
	console.log(x)
}

구현

Input/Output

   a
    b
 
     c

위 input의 경우 모든 라인의 앞부분 공통 공백은 3개다.
참고로 3번째 라인은 공백만 존재하는 라인이다.

a
 b
 
  c

Code

const removeCommonLeadingSpaces = (str) => {  
    const lines = str.split("\n");
    const common_spaces = lines
        .filter(l => l.trim())
        .map(l => l.match(/^ */)[0].length)
        .reduce((a, b) => Math.min(a, b), 999);
    return lines.map(l => l.slice(common_spaces)).join("\n");
}
  1. 스트링을 라인 배열으로 분리
  2. filter: 공백 라인제거
  3. map: 앞쪽 공백 수로 변환
  4. reduce: 최소값
  5. 라인 배열 각 라인에서 공백 최소값 제거 후 결합