indexOf(), slice()로 특정 문자열 제거하기

라용·2022년 8월 20일
0

위코드 - 스터디로그

목록 보기
10/100

wecode 레플릿 과제를 풀며 정리한 내용입니다.

주소에서 도시를 찾아 삭제하고 새로운 주소를 리턴합니다. 도시는 무조건 '시'로 끝납니다.

입력 - "경기도 성남시 분당구 중앙공원로 53"
리턴 - "경기도 분당구 중앙공원로 53"

입력 - "서울특별시 강남구 강남대로 35"
리턴 - "강남구 강남대로 35"

'경기도 성남시~' 처럼 앞에 도가 붙을 경우 도시명은 총 3자이고, 도가 없고 '서울특별시, 부산광역시' 같은 도시명이 앞으로 올 때는 5자 임을 미리 파악해야 합니다.
아래는 도 뒤에 오는 시 이름이 랜덤할 수 있다는 잘못된 가정을 하고 작성한 코드입니다.

let address = "경기도 성남시 분당구 중앙공원로 53"

let city = address.substring(address.indexOf(" "), address.indexOf("시")+1);
let deleteNum = address.indexOf(city);

console.log(city); // =>  성남시(앞에 공백 있음)
console.log(deleteNum); // => 3 (성남시 앞 공백의 인덱스 넘버)

앞에 도가 있을 경우 도시명 앞에 무조건 공백이 오므로 substring() 메소드로 공백과 시 사이의 문자열을 추출하고 그 문자열의 인덱스 값을 구합니다. 그래고 아래와 같이 함수를 만듭니다.

function sliceCityFromAddress(address) {
	address = address.slice(0, deleteNum) + address.slice(deletNum + city.length, address.length);
	return address;
}

slice(a, b) 메소드는 a 부터 b 인덱스 앞까지의 문자열을 추출합니다. 지워야 할 문자열 " 성남시" 의 앞까지 내용을 추출하고, 그 지점에서 " 성남시"의 문자열 길이를 더한 지점부터 끝 부분까지를 추출합니다.
이렇게 작성할 경우 도 뒤에 나오는 시의 길이에 상관없이 추출이 가능하지만 도 없이 '서울특별시' 만 나올 경우 앞에 공백이 없으므로 동작하지 않습니다.

테스트에 통과한 코드는 아래와 같습니다.

let address = "경기도 성남시 분당구 중앙공원로 53"

function sliceCityFromAddress(address) {
	let siIndex = address.indexOf("시")
	let doIndex = address.indexOf("도")
	if (siIndex !== -1 && doIndex !== -1) {
		return address = address.slice(0, siIndex - 2) + address.slice(siIndex + 2, address.length)
	} else if (doIndex === -1) {
        return address = address.slice(0, siIndex - 4) + address.slice(siIndex + 2, address.length);
	}
}

console.log(sliceCityFromAddress(address));

indexOf() 로 확인한 문자열이 없을 경우 -1 을 반환하는 것으로 조건문을 작성합니다. 시와 도가 둘 다 있을 경우 3글자인 도시명만 제외하고 추출하고, 도가 없을 경우 5글자인 도시면을 제외하고 추출합니다.

profile
Today I Learned

0개의 댓글