sort는 얕은복사라 원본을 바꾼다!
알고리즘을 하면서 느낀건데 sort를 쓰다보면 코드의 효율성에서 막히는 경우도 많이 봤다. 효율이 좋은 편은 아닌듯..
얕은복사라는걸 알게 된 경위는 변수로
let sortArr = 원본배열.sort((a,b) => b-a)
//원본 배열은 인자로 받음
처럼 만들고, 원본배열을 따로 호출해서 인덱스를 살펴봤는데, 원본배열이랑 다르게 나오는 상황에서 알아차렸다.
let sortArr = priorities.sort((a,b)=> b-a)
//sort()는 shallow coppy라서 원본을 바꾼다.
let newArr= priorities.filter(el=>el !==priorities[location])
console.log(priorities[location])//3이 나와야하는데 2가 나오는 상황.
//priorities = [2, 1, 3, 2], location=2 라서 원본대로라면 3이 나와야하지만,
//sort를 사용함에 따라 priorities = [1, 2, 2, 3]으로 바뀌었다.
깊은 복사는 데이터 전체를 복사하지만, 얕은 복사는 데이터의 주소만 복사하는것과 같다
원본이 안전한 깊은복사와는 다르게 얕은 복사는 원본이 바뀌어버리므로, 주의해야한다!
원본 배열을 수정하지 않고 우선순위를 정렬하려면 slice로 배열의 복사본을 만든 뒤 정렬하는게 맞다.
let sortArr = priorities.slice().sort((a, b) => b - a);
이렇게 하면 필터링이나 수정과 같은 작업이 원본에 영향을 미치지 않게된다!
let numbers = [1, 10, 2, 20, 50];
numbers.sort(function compare(a, b) {
if(a > b) return 1;
if(a < b) return -1;
return 0;
});
console.log(numbers); // [1,2,10,20,50]
if(a > b) return 1
리턴값 > 0이므로 a가 b 뒤에 위치하게 된다.
if(a < b) return -1
리턴값 < 0이므로 a는 b 앞에 온다.