Предположим, мне нужна функция сортировки, которая возвращает отсортированную копию введенного массива. Я наивно пробовал это
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);
}
но это не работает вообще.
Есть ли прямой способ обойти это, предпочтительно способ, который не требует ручного скручивания моего собственного алгоритма сортировки или копирования каждого элемента массива в новый?
javascript
Питер Олсон
источник
источник
.sort
требует, чтобыthis
значение было массивом, поэтому, чтобы последний фрагмент работал, вы бы это сделали.sort.call(arr)
(хотя это не решит вашу проблему).Ответы:
Просто скопируйте массив. Есть много способов сделать это:
источник
concat
over sayslice(0)
или все они почти одинаковые?Array.prototype.slice.call(arr).sort();
вместоarr.slice().sort();
?Другой способ с es6 (не глубокая копия):
синтаксис распространения как литерал массива (скопировано из mdn):
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator
источник
Попробуйте следующее
slice(0)
Выражение создает копию массива , начиная с элемента 0.источник
Вы можете использовать слайс без аргументов для копирования массива:
источник
Вы также можете сделать это
Таким образом, d не будет видоизменяться.
источник
Любой, кто хочет сделать глубокую копию (например, если ваш массив содержит объекты), может использовать:
Тогда вы можете сортировать
arrCopy
без измененийarr
.Обратите внимание: это может быть медленно для очень больших массивов.
источник
-
вместо>
вашего второго примера.Я использую Object.assign () для большинства моих копий:
Однако, просмотрев комментарии OP, я немного углубился в копирование и выяснил, что Object.assign не только выполняет поверхностное копирование, но и только выбирает перечисляемые и собственные свойства (как ответили в этом посте ).
источник