Computer >> 컴퓨터 >  >> 프로그램 작성 >> JavaScript

JavaScript의 .sort() 메서드 문제 수정, 하나가 아닌 두 개의 배열 정렬

<시간/>

Array.prototype.sort() 함수의 속성 중 하나는 내부 정렬 알고리즘이라는 것입니다. 즉, 정렬할 배열의 새 복사본을 생성하지 않고 추가 공간을 사용하지 않고 배열을 정렬하므로 더 효율적이고 성능이 좋습니다. 그러나 이러한 특성은 때때로 어색한 상황을 초래합니다.

예를 들어 이것을 이해합시다. 일부 문자열 리터럴이 있는 이름 배열이 있다고 가정합니다. 이 배열의 순서를 그대로 유지하고 이름 배열과 동일한 요소를 포함하지만 알파벳순으로 정렬된 다른 배열을 원합니다.

우리는 다음과 같이 할 수 있습니다 -

const names = ['Rakesh', 'Mukesh', 'Ram', 'Anshul', 'Dheeraj'];
let sortedNames = names;
sortedNames = sortedNames.sort();
console.log(names);
console.log(sortedNames);

그러나 JavaScript에서 알 수 있듯이 배열도 객체이고 객체는 값이 아닌 참조로 복사됩니다. 따라서 하나의 배열을 정렬하면 두 배열이 모두 정렬되는 결과를 초래하는데, 이는 분명히 원하지 않습니다.

솔루션

1. 새 배열을 초기화하는 동안 slice() 사용

예시

const names = ['Rakesh', 'Mukesh', 'Ram', 'Anshul', 'Dheeraj'];
let sortedNames = names.slice();
sortedNames = sortedNames.sort();
console.log(names);
console.log(sortedNames);

slice() 메서드는 실제로 사용된 배열의 새 배열에 복사된 얕은 복사본을 반환합니다. 인수가 제공되지 않으면 처음부터 끝까지 복사합니다.

이 방법은 새로운 배열을 초기화하는 것을 포함하고 String / Number 리터럴의 배열에서만 효과적이기 때문에 그다지 효율적이지는 않지만, 두 번째 방법은 조금 더 효율적이고 객체 배열에서도 잘 작동합니다.

2. JSON.stringify() / JSON.parse() 사용

예시

const names = ['Rakesh', 'Mukesh', 'Ram', 'Anshul', 'Dheeraj'];
let sortedNames = JSON.parse(JSON.stringify(names));
sortedNames = sortedNames.sort();
console.log(names);
console.log(sortedNames);

배열을 JSON 문자열로 변환하고 어떤 식으로 다시 배열로 변환하면 컴파일러가 강제로 참조로 복사하지 않습니다.

두 방법의 출력은 콘솔에서 동일합니다 -

출력

[ 'Rakesh', 'Mukesh', 'Ram', 'Anshul', 'Dheeraj' ]
[ 'Anshul', 'Dheeraj', 'Mukesh', 'Rakesh', 'Ram' ]