Ответ 1
Просто скопируйте массив. Есть много способов сделать это:
function sort(arr) {
return arr.concat().sort();
}
// Or:
return Array.prototype.slice.call(arr).sort(); // For array-like objects
Предположим, что мне нужна функция сортировки, которая возвращает отсортированную копию введенного массива. Я наивно пробовал это
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
Попробуйте выполнить
function sortCopy(arr) {
return arr.slice(0).sort();
}
Выражение slice(0)
создает копию массива, начиная с элемента 0.
немного более чистое решение для не-глубокой копии с 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
Вы можете использовать срез без аргументов для копирования массива:
var foo,
bar;
foo = [3,1,2];
bar = foo.slice().sort();
Я использую Object.assign() для большинства моих копий:
var copyArray = Object.assign([], originalArray).sort();
Однако, просмотрев комментарии OP, я исследовал немного глубокого копирования и получается Object.assign не только выполняет мелкую копию, но также только выбирает перечислимые и собственные свойства (как указано в этот пост).