sort() 함부로 쓰다가 코드 꼬여서 쓰는 개인정리

돌리의 하루·2024년 1월 10일

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]
  1. if(a > b) return 1
    리턴값 > 0이므로 a가 b 뒤에 위치하게 된다.

  2. if(a < b) return -1
    리턴값 < 0이므로 a는 b 앞에 온다.

profile
진화중인 돌리입니다 :>

0개의 댓글