Сортировка массивов в JS

November 20, 2018

Дьявол в деталях Array().sort()


Недавно на собеседовании вопрос услышал про сортировку. Он простой как 2 копейки и сразу можно вспомнить, даже не зная, что и почему. Но он забавный.

Как отсортировать элементы массива?

Дано:

var a = [1,0,3,2,5,4,9,8,6]

Ответ, вроде бы, очевиден и он даже работает:

a.sort()
[0, 1, 2, 3, 4, 5, 6, 8, 9]

Уточняем, как работает сортировка и спрашиваем, как отсортируется массив:

[1,0,11,10,9,7,2].sort()

У кандидата начинают закрадываться подозрения что где-то есть подвох. Но предыдущий пример вроде бы сработал же… И тут он видит результат:

[0, 1, 10, 11, 2, 7, 9]

Далее задается вопрос — а чо так? И тут вот либо человек быстро соображает и, зная особенности языка, говорит почему так (не знал, но вспомнил), либо начинает говорить что это магия и JS такой джаваскрипт. Бага, плохой и вообще… Вот далее ответ для тех, кто считает что JS плохой.

JavaScript хороший

JS хороший, просто надо знать базу. По дефолту метод sort() сортирует все элементы как строки, вне зависимости от того, что в массиве. Чтобы отсортировать числа, вам нужно заменить встроенную функцию сортировки на свою пользовательскую:

[0, 1, 10, 11, 2, 7, 9].sort((a,b)=>a-b)

Вот теперь все работает корректно. Нет магии, язык не сломан, нет багов, все работает как и задумывалось. Оно может не очевидно и не оправдывает ожидания (ведь могли бы добавить проверку типов). Но все же оно работает правильно и как задумано.


Profile picture

Written by Alexander Mayorov
Full Stack CTO