Изменяет ли функция .sort оригинальный массив?
Описание проблемы
Я работаю с массивом в JavaScript и у меня есть следующий код:
arr = arr.sort(function (a, b) {
return a.time > b.time;
});
Мне нужно понять, нужно ли мне переопределять массив arr после сортировки, или можно просто вызвать функцию sort, как в следующем примере:
arr.sort(function (a, b) {
return a.time > b.time;
});
Также мне интересно, изменят ли функции sort и filter оригинальный массив или они создадут новый?
Заранее спасибо за помощь!
4 ответ(ов)
Когда вы используете метод sort() на массиве, он изменяет оригинальный массив. Например:
var arr = [{time: 4}, {time: 3}, {time: 6}];
arr.sort(function (a, b) {
return a.time - b.time;
});
В результате сортировки оригинальный массив arr изменится, и вы получите:
[ { time: 3 }, { time: 4 }, { time: 6 } ]
Поэтому, если вы выполните console.log(arr), вы увидите:
[ { time: 3 }, { time: 4 }, { time: 6 } ]
Чтобы избежать изменения оригинального массива, вы можете использовать метод slice(), который создает поверхностную копию массива. Вот как это можно сделать:
var arr = [{time: 4}, {time: 3}, {time: 6}];
arr.slice().sort(function (a, b) {
return a.time - b.time;
});
Этот код отсортирует копию массива, и результат будет:
[ { time: 3 }, { time: 4 }, { time: 6 } ]
Однако оригинальный массив arr останется неизменным, и вызов console.log(arr) вернет:
[ { time: 4 }, { time: 3 }, { time: 6 } ]
Таким образом, использование slice() перед sort() позволяет сортировать массив, не modifying исходный массив.
Это неплохой вопрос, и давайте ответим на него корректно:
const a = [1, 2, 3];
const b = a.sort();
console.log(a === b); // true
Вот ваш ответ. Оператор === для объектов будет сравнивать расположение в памяти, поэтому это один и тот же объект в памяти.
На самом деле, было бы лучше, если бы sort создавал новый массив (неизменяемость и т. д.), но во многих языках он не возвращает новый массив, а модифицирует существующий (изменяет порядок).
Таким образом, если вы хотите, чтобы массив был неизменяемым, вы можете сделать следующее:
const a = [1, 2, 3];
const b = a.slice(0).sort();
Да, sort() изменяет оригинальный массив.
В приведённом вами коде массив a сортируется с помощью метода sort(), который, как указано, изменяет исходный массив. Вот объяснение:
const a = [1, 2, 3]; // Исходный массив
const b = a.sort(); // Сортируем массив a, b ссылается на a
const c = [...a].sort(); // Создаём новый массив с помощью операторов расширения и сортируем его
console.log(a === b); // true, поскольку b ссылается на тот же массив, что и a
console.log(a === c); // false, поскольку c - это новый массив, и ссылки на них разные
Таким образом, b и a указывают на один и тот же отсортированный массив, а c - это новый отсортированный массив, созданный на основе копии a.
Ваша запись использует оператор расширения (spread operator) и метод sort() для сортировки массива. Вот что происходит в этом коде:
const a = [1, 2, 3]; // Инициализируем массив a
const b = [...a].sort(); // Создаем новый массив b, используя оператор распространения, и сортируем его
Как работает код:
...aсоздает новый массив, который является копией массиваa. Это важно, потому что методsort()сортирует массив "на месте", т.е. изменяет исходный массив. Используя оператор наложения, вы избегаете изменения оригинального массиваa.- Метод
sort()сортирует элементы нового массива в порядке возрастания. Поскольку массивaуже отсортирован,bбудет содержать те же значения[1, 2, 3].
Если вам нужно отсортировать массив, содержащий числа в произвольном порядке, важно помнить, что метод sort() по умолчанию сортирует элементы как строки. Для сортировки чисел нужно передать ему функцию сравнения:
const a = [3, 1, 2];
const b = [...a].sort((x, y) => x - y); // b будет равен [1, 2, 3]
Таким образом, если требуется сортировка по числам, используйте функцию (x, y) => x - y.
Сортировка массива объектов по значению строкового свойства
Сортировка массива объектов по значениям свойств
Как отсортировать массив целых чисел?
Как перемешать (сделать случайным) массив в JavaScript?
Как удалить все дубликаты из массива объектов?