정수 n을 기준으로 n과 가까운 수부터 정렬하려고 합니다. 이때 n으로부터의 거리가 같다면 더 큰 수를 앞에 오도록 배치합니다. 정수가 담긴 배열 numlist와 정수 n이 주어질 때 numlist의 원소를 n으로부터 가까운 순서대로 정렬한 배열을 return하도록 solution 함수를 완성해주세요.
function solution(numlist, n) {
return numlist.sort((a,b)=>{
const [num1,num2] = [Math.abs(n-a),Math.abs(n-b)];
if(num1 === num2) return b-a
return num1-num2
})
}
function solution(numlist, n) {
return numlist.sort((a, b) => Math.abs(a - n) - Math.abs(b - n) || b - a);
}
=> || 가 메서드 안에서 사용되면 무슨 의미인지를 잘 몰랐었는데 '단축평가 또는 단락평가(short-circuit)'라는 것을 이번에 알게되었다. || 앞의 항이 true이면 뒷 항은 평가도 하지 않지만 || 항이 false라면 뒷항으로 평가된다. 그래서 거리가 같은 경우에는 || 뒷항으로 평가되는 것이다.
function solution(numlist, n) {
return numlist.sort((a,b)=>b-a).sort((a,b)=>Math.abs(a-n)-Math.abs(b-n))
}
=> 먼저 원소들을 내림차순해주고 원소에서 n이 가까운 순으로 정렬해주었다.
단락평가(short-circuit)
논리 연산자는 왼쪽에서 오른쪽의 순서로 평가하므로, 다음 규칙을 사용해서 "단락"(short-circuit) 평가가 가능한지 판별합니다.false && 아무거나는 거짓으로 단락 평가합니다.
true || 아무거나는 참으로 단락 평가합니다.
논리 규칙은 위의 단락 평가가 항상 옳음을 보증합니다. 아무거나 부분의 표현식은 평가도 하지 않으므로, 해당 표현식에서 유발하게 되는 부수 효과도 전혀 발생하지 않음에 주의하세요.참고로 ||을 사용한 두 번째 단락 평가의 경우, 최근 코드에서는 새로운 널 병합 연산자 (??)를 사용할 수도 있습니다. 널 병합 연산자는 첫 번째 연산자가 "널과 유사"한, 즉 null이거나 undefined일 때만 두 번째 피연산자를 반환합니다. ''와 0도 유효한 값이라면 널 병합 연산자가 기본 값을 나타낼 때 더 좋은 선택지입니다.