Как вы можете отсортировать массив без изменения исходного массива?

Предположим, что мне нужна функция сортировки, которая возвращает отсортированную копию введенного массива. Я наивно пробовал это

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);
}

но он вообще не работает.

Существует ли простой способ, предпочтительный способ, который не требует ручной перемотки моего собственного алгоритма сортировки или копирования каждого элемента массива в новый?

Ответ 1

Просто скопируйте массив. Есть много способов сделать это:

function sort(arr) {
  return arr.concat().sort();
}

// Or:
return Array.prototype.slice.call(arr).sort(); // For array-like objects

Ответ 2

Попробуйте выполнить

function sortCopy(arr) { 
  return arr.slice(0).sort();
}

Выражение slice(0) создает копию массива, начиная с элемента 0.

Ответ 4

Вы можете использовать срез без аргументов для копирования массива:

var foo,
    bar;
foo = [3,1,2];
bar = foo.slice().sort();

Ответ 5

Я использую Object.assign() для большинства моих копий:

var copyArray = Object.assign([], originalArray).sort();

Однако, просмотрев комментарии OP, я исследовал немного глубокого копирования и получается Object.assign не только выполняет мелкую копию, но также только выбирает перечислимые и собственные свойства (как указано в этот пост).