사이트를 올리고 나의 코드를 보며 문제점을 관찰하자
우리는 배열과 객체에서 오름차순으로 만들어야할 때가 온다. 그럴때마다 obj(arr).sort()
라는 메소드를 필수적으로 써야한다. 유니코드 코드포인트에 따라 정렬된다.
const months = ['March', 'Jan', 'Feb', 'Dec'];
months.sort();
console.log(months);
// ["Dec", "Feb", "Jan", "March"]
const array1 = [1, 30, 4, 21, 100000];
array1.sort();
console.log(array1);
// [1, 100000, 21, 30, 4]
위 코드에서 문제가 무엇인지 발견했는가? sort()
메소드는 괄호 안에 아무 것도 주어지지 않는다면 배열들이 문자열로 변환된 다음 맨 앞의 자릿수만 비교해 저런 결과가 나타난다. 알파벳처럼 순위가 정해진다는 뜻 그래서 괄호 안에 compareFunction
라는 걸 집어 넣는다.
sort()
괄호 안에 compareFunction
을 집어 넣는다. 즉 compare 함수가 내장돼 있어 두개의 값이 비교돼 작거나 크면 1, -1을 반환해 차순을 조정한다. 그래서 함수를 넣어줘 변수인 a와 b를 할당해줘 비교한다.
const array1 = [1, 30, 4, 21, 100000];
// 정석 : 익명함수를 입력, compare 함수 안에 써주니 함수 안 함수의 중첩 구조이다.
array1.sort(function (a, b) {return a - b});
// 화살표 함수
array1.sort((a, b) => a - b);
console.log(array1);
// [1, 100000, 21, 30, 4]
function solution(arr, divisor) {
let answer = [];
if (arr.length > 0) {
for (i = 0; i < arr.length; i++) {
if (arr[i] % divisor === 0) {
answer.push(arr[i])
}
}
}
if (answer.length === 0) {
answer.push(-1)
}
answer.sort((a, b) => a - b)
return answer;
}
filter
, map
등의 고차 함수(Higher-Order Function)들을 사용하지도 않았고, 삼항연산자도 안써줬다. 이걸 보며 비교해보자. 알아가자
function solution(arr, divisor) {
// 고차 함수로 위의 for-if를 콜백 함수를 인수로 받아 줄여준 모습
const answer = arr.filter(i => i % divisor === 0);
// 삼항 연산자로 return에 압축
return answer.length !== 0 ? answer.sort((a, b) => a - b) : [-1];
}