[javascript] 원래 배열을 변경하지 않고 어떻게 배열을 정렬 할 수 있습니까?
입력 된 배열의 정렬 된 사본을 반환하는 정렬 함수를 원한다고 가정 해 봅시다. 나는 순진하게 이것을 시도했다.
function sort(arr) {
return arr.sort();
}
그리고 이것을 테스트하여 내 sort
방법이 배열을 변경하고 있음을 보여줍니다 .
var a = [2,3,7,5,3,7,1,3,4];
sort(a);
alert(a); //alerts "1,2,3,3,3,4,5,7,7"
나는 또한이 접근법을 시도했다.
function sort(arr) {
return Array.prototype.sort(arr);
}
그러나 전혀 작동하지 않습니다.
이 방법에 대한 간단한 방법이 있습니까? 가능하면 내 자체 정렬 알고리즘을 수동으로 롤링하거나 배열의 모든 요소를 새 것으로 복사 할 필요가없는 방법이 있습니까?
답변
배열을 복사하십시오. 여러 가지 방법이 있습니다.
function sort(arr) {
return arr.concat().sort();
}
// Or:
return Array.prototype.slice.call(arr).sort(); // For array-like objects
답변
es6의 다른 방법 (비 복사) :
const sorted = [...arr].sort();
배열 리터럴로서의 확산 구문 (mdn에서 복사) :
var arr = [1, 2, 3];
var arr2 = [...arr]; // like arr.slice()
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator
답변
다음을 시도하십시오
function sortCopy(arr) {
return arr.slice(0).sort();
}
slice(0)
식은 요소 0 어레이 개시의 복사본을 생성한다.
답변
인수없이 slice를 사용하여 배열을 복사 할 수 있습니다.
var foo,
bar;
foo = [3,1,2];
bar = foo.slice().sort();
답변
당신은 또한 이것을 할 수 있습니다
d = [20, 30, 10]
e = Array.from(d)
e.sort()
이러한 방식으로 d는 변이되지 않을 것이다.
function sorted(arr) {
temp = Array.from(arr)
return temp.sort()
}
//Use it like this
x = [20, 10, 100]
console.log(sorted(x))
답변
딥 카피를 수행하려는 사람은 (예 : 배열에 객체가 포함 된 경우) 다음을 사용할 수 있습니다.
let arrCopy = JSON.parse(JSON.stringify(arr))
그런 다음을 arrCopy
변경하지 않고 정렬 할 수 있습니다 arr
.
arrCopy.sort((obj1, obj2) => obj1.id > obj2.id)
참고 : 매우 큰 배열의 경우 속도가 느려질 수 있습니다.
답변
필자 는 대부분의 복사본에 Object.assign () 을 사용합니다 .
var copyArray = Object.assign([], originalArray).sort();
그러나 OP 주석을 살펴본 후 약간의 깊은 복사를 연구하고 Object.assign이 얕은 복사를 수행 할뿐만 아니라 열거 할 수 있고 고유 한 속성 만 선택합니다 ( 이 게시물 에서 답변 ).