Jaguar_ko
@Jaguar_ko

Array.sort или сортировка массивов?

Здравствуйте!


Есть фича в JS:

[0, 2, 4, 6, 8, 10, 12, 14].sort() == [0, 10, 12, 14, 2, 4, 6, 8]


вернет false

но если сделать [0, 2, 4, 6, 8, 10, 12, 14].sort()

то получим как раз [0, 10, 12, 14, 2, 4, 6, 8]

Но это не главное:)

Главное — как сортировать массив правильно? т.е.
[0, 2, 4, 6, 8, 10, 12, 14].sort() == [0, 2, 4, 6, 8, 10, 12, 14]
  • Вопрос задан
  • 8380 просмотров
Решения вопроса 1
pashak
@pashak
1) Сравнение массивов. Как отмечал haaji, выражение []==[] ложно. Всё дело в том, что сравниваются 2 совершенно разных массива (заданные первыми и вторыми квадратными скобками), а так как массивы являются объектами, то и проверяются они по ссылке, а значит, они в данном случае не будут равны. Если хотите сравнить 2 массива с простыми (нессылочными типами: числами, строками, true/false) значениями внутри, то можно преобразовывать массив в строку, с использованием метода join и потом сравнивать уже строки.

console.log([1,2,3].join(",")==[1,2,3].join(","));

Если содержатся ссылочные типы, то в любом случае нужно будет сравнивать поэлементно. Можно использовать JSON.stringify, но там есть свои особенности (например, порядок определения свойств).

2) Сортировка массивов. Array.prototype.sort может принимать в качестве аргумента функцию, в которую будут переданы 2 аргумента — элементы массива, и данная функция должна вернуть -1, 0, 1 в зависимости от того, какой элемент считать большим, либо равными (0). После вызова sort массив, для которого она была вызвана, будет изменён. Если sort не приняла функцию-сортировщик, то элементы массива сравниваются как элементарные значения.

Обобщая эти 2 пункта:

var a = [2, 3, 1],
	a1= [3, 2, 1];
console.log(a.sort().join(",")===a1.sort().join(","));
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@haaji
для начала попробуйте [] == [], это Вас, наверное удивит.
а затем почитайте про сортировку в js и научитесь передавать функции sort нужные аргументы.
Ответ написан
max7
@max7
max7
К сожалению метод array.sort без параметров работает как array.sort(String). Но это как уже сказали фича, а не баг, ввиду нетипизированности массивов в js. Поэтому в общем случае обязательно нужно передавать функцию сравнения.
Ответ написан
Комментировать
gaelpa
@gaelpa
Судя по результату, у вас массив строк?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
21 нояб. 2024, в 23:30
300000 руб./за проект
21 нояб. 2024, в 22:21
3000 руб./в час
21 нояб. 2024, в 21:42
100000 руб./за проект