[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이 얕은 복사를 수행 할뿐만 아니라 열거 할 수 있고 고유 한 속성 만 선택합니다 ( 이 게시물 에서 답변 ).