Nikita
Ну да.
Nikita
Я объяснял человеку, почему эта штука ведёт себя не так, как он ожидает, и почему она может вести себя по разному в зависимости от реализации.
Dima
за это спасибо
Anonymous
а дальше, "NaN - число" => NaN или "число - NaN" => NaN как было у него. И результат будет зависить от реализации самой сортировки
Nikita
Nikita
@maxgraey Я отвечал не тебе.
Nikita
он должен возвращать -1, 0, +1
А вот это не верно. Он может и -0.1, 0, и 42 возвращать.
Nikita
Но вот NaN он возвращать не должен.
Anonymous
А вот это не верно. Он может и -0.1, 0, и 42 возвращать.
Конечно может. Вообще реализация обычно предпологает что то такое if (comparatorFn(a, b) < 0) swap(a, b). Так что там важен знак и 0 только
Nikita
Но вот NaN он возвращать не должен.
А в примере @micromechanika — возвращает.
Anonymous
А в примере @micromechanika — возвращает.
Ты удивишься, но все поголовно именно так и пишут arr.sort((a, b) => a - b) Не задумываясь, что может быть NaN
Anonymous
Вот прям находил такое в довольно серьездных проектах
Anonymous
Еще классика: arr[i / 2] = b
Maksim
Можно и a-b, если уверен, что подаёшь только валидные числа.
Anonymous
Можно и a-b, если уверен, что подаёшь только валидные числа.
в js нельзя быть увереннным ни в чем =) Тем более если это приходит со стороннего сервиса
Maksim
в js нельзя быть увереннным ни в чем =) Тем более если это приходит со стороннего сервиса
но это еще не значит что компаратор должен следить за типами
Maksim
А a > b - a < b - хоть и круто, но нечитабельно.
Anonymous
А a > b - a < b - хоть и круто, но нечитабельно.
правильно, поэтому будем писать неправильно, но зато читабельно)
Maksim
Будем писать правильно и читабельно
Maksim
И либо не будем пропускать говно в компаратор, либо напишем что-то более вразумительное.
Maksim
Если предполагается, что кто-то будет читать код
Nikita
['a',1,2,3,4,1111,30,444].filter(Number).sort((a, b) => a > b - a < b)
А вот теперь отвечу тебе. > ['a',1,2,3,4,1111,30,444].filter(Number).sort((a, b) => a > b - a < b) [ 444, 30, 1111, 4, 3, 2, 1 ]
Nikita
Так и должно быть?
Maksim
^^^ :)
Anonymous
javascript ['a',1,2,3,4,1111,30,444].filter(Number).sort((a, b) => (a > b) - (a < b)) > [1, 2, 3, 4, 30, 444, 1111]
Dima
запусти тоже самое в гугле
Anonymous
Скобки пропустил)
Anonymous
запусти тоже самое в гугле
Уже добрался до мака и проверил. Что не так?
Anonymous
Если хочешь оставить 'a' то просто делай это без filter(Number)
Dima
всё норм прошу прощения
Maksim
Скобки пропустил)
А проверка на валидность и не требуется если помнишь про приоритет операторов. (Хоть ты и поменял сообщение)
Dima
Погоди а что делает выражение (a>b)-(a<b) когда мы букавы отбросили фильтром))))?
Nikita
Фигня получится =).
> [' -21.5 ',1,2,3,4,1111,30,444,-900].sort((a, b) => (a > b) - (a < b)) [ -900, ' -21.5 ', 1, 2, 3, 4, 30, 444, 1111 ] > [' -21.5 ','-21 USD',1,2,3,4,1111,30,444,-900].sort((a, b) => (a > b) - (a < b)) [ ' -21.5 ', '-21 USD', -900, 1, 2, 3, 4, 30, 444, 1111 ]
Anonymous
Фигня получится =).
Нет, не фигня, все alphabetical значения будут в начале массива
Anonymous
Фиг. Смотри.
Ну? Я вижу что все строки вначале
Nikita
Относительный порядок ' -21.5 ‘ и -900 разный в зависимости от исходного массива.
Nikita
Это видишь?
Anonymous
Относительный порядок ' -21.5 ‘ и -900 разный в зависимости от исходного массива.
Ну да, ты прав. Короче нельзя так просто сортировать mixed typed array
Maksim
Можно, но не хаками типа «я крутой программист»
Anonymous
Короче, переходите все на typescript и будет вам счастье)))
Maksim
Тайпскрипт не сделает умнее
Nikita
Можно, но не хаками типа «я крутой программист»
Этот хак эквивалентен большому ифу, сравнивающему a < b, a > b, и возвращаещуму -1, 1, и 0.
Maksim
Anonymous
Мне лень :)
Не ну, конечно можно прописать все кейсы для смешанных пар, но это треш
Maksim
Этот хак эквивалентен большому ифу, сравнивающему a < b, a > b, и возвращаещуму -1, 1, и 0.
Поэтому если говно в компаратор всё-таки попало, одного сравнения не достаточно.
Dima
да ну нафиг массив нужно нормальный давать а не говно и всё будет в порядке
Dmitriy
пытаюсь врубиться в задачку про sort, но не поинмаю суть задачи. может кто-то еще раз прояснить что требуется?
Dima
пытаюсь врубиться в задачку про sort, но не поинмаю суть задачи. может кто-то еще раз прояснить что требуется?
Смотри масив есть ['a',1,1000,2312,3,2,34] из него нужно найти наибольшее число так вот браузеры Google & Firefox с этим справляются по разному а нужно было что бы они работали одинаково
Dmitriy
Спасибо,
Dmitriy
хорошо, нужно найти число, но в массиве есть не число. как с ним поступать?
Dmitriy
именно по задумке логики
Nikita
Ну да, ты прав. Короче нельзя так просто сортировать mixed typed array
Вот более простой пример: > [ '-21', 1, 2, 'a' ].sort((a, b) => (a > b) - (a < b)) [ '-21', 1, 2, 'a' ] > [ 1, 'a', '-21', 2 ].sort((a, b) => (a > b) - (a < b)) [ '-21', 1, 'a', 2 ]
Dmitriy
вот есть у меня буква 'a' и число 2. что больше?
Anonymous
Мне лень :)
Я за тебя напишу: javascript ['a',1,'ab',2,3,-4,1111,30,444].slice().sort((a, b) => isNaN(a + b) ? a.toString().localeCompare(b) : +a - +b) > [-4, 1, 2, 3, 30, 444, 1111, "a", "ab"]
Nikita
Потому что типы разные.
Dmitriy
кажется я постепенно догоняю в чем вопрос. Не важно буква больше числа или нет. Человеку важно. чтобы результат отработки был одинаковый в браузерах
Dmitriy
так?
Dmitriy
на самом деле нужно было отсеять числа скорее всего)))
я чувствую себя тупым. но я так и не понял истинной цели задачи, отсортировать по возрастанию. или отсеять числа, или проверть кроссбраузерность
Anonymous
Короче вот: javascript ['a',1,'ab',2,3,-4,1111,30,444, NaN, null].slice().sort((a, b) => (!a || !b) ? -1 : isNaN(a + b) ? (a + '').localeCompare(b) : +a - +b) > [null, NaN, -4, 1, 2, 3, 30, 444, 1111, "a", "ab"]
Maksim
(a+'') можно сделать читаемым: String(a)
Maksim
но это не решает проблему -Infinity и Infinity.