Вот номер версии программного обеспечения:
"1.0", "1.0.1", "2.0", "2.0.0.1", "2.0.1"
Как я могу сравнить это? Предположим, правильный порядок:
"1.0", "1.0.1", "2.0", "2.0.0.1", "2.0.1"
Идея проста ...: прочитать первую цифру, затем, вторую, после этого третью .... Но я не могу преобразовать номер версии в число с плавающей запятой .... Вы также можете увидеть номер версии как этот:
"1.0.0.0", "1.0.1.0", "2.0.0.0", "2.0.0.1", "2.0.1.0"
и это более ясно, чтобы увидеть, что за идея ... Но, как преобразовать его в компьютерную программу? Есть ли у кого-нибудь идеи о том, как сортировать это? Спасибо.
javascript
sorting
Tattat
источник
источник
Ответы:
Основная идея сделать это сравнение состоит в том, чтобы использовать
Array.split
для получения массивов деталей из входных строк, а затем сравнивать пары деталей из двух массивов; если части не равны, мы знаем, какая версия меньше.Есть несколько важных деталей, о которых следует помнить:
Вот код для реализации, которую вы можете использовать напрямую ( с документацией ):
Эта версия естественно сравнивает части , не принимает символьные суффиксы и считает, что «1.7» меньше, чем «1.7.0». Режим сравнения может быть изменен на лексикографический, а более короткие строки версии могут быть автоматически дополнены нулями, используя необязательный третий аргумент.
Существует JSFiddle , который работает «юнит - тестов» здесь ; это слегка расширенная версия работы ripper234 (спасибо).
Важное примечание: этот код использует
Array.map
иArray.every
, что означает, что он не будет работать в версиях IE более ранних, чем 9. Если вам потребуется их поддержка, вам придется предоставить полифилы для отсутствующих методов.источник
semver
Парсер семантической версии, используемый npm.
$ npm установить семвер
Ссылка на семантическое управление версиями :
https://www.npmjs.com/package/semver#prerelease-identifiers
источник
источник
var len = Math.min(a_components.length, b_components.length);
приведет к тому, что версии 2.0.1.1 и 2.0.1 будут рассматриваться как равные, не так ли?a = '7'
иb = '7.0'
возврат,-1
потому что 7.0 длиннее. Есть какие-нибудь предложения для этого? (console.log(compare("7", "7.0")); //returns -1
)Эта очень маленькая, но очень быстрая функция сравнения принимает номера версий любой длины и любого размера на сегмент .
Возвращаемые значения:
- число,
< 0
если a <b- число,
> 0
если a> b-
0
если a = bТаким образом, вы можете использовать его как функцию сравнения для Array.sort ();
РЕДАКТИРОВАТЬ: Исправленная версия убирает конечные нули, чтобы признать "1" и "1.0.0" равными
источник
["0.0.0", "0.0", "0.4.1", "0.5", "1.0.0", "1", "1.1", "1.2.15", "1.25.4", "2", "2.5.0", "2.5.10", "2.5.10.4159", "10.5"]
там, где выводит ваш код["0.0", "0.0.0", "0.4.1", "0.5", "1", "1.0.0", "1.1", "1.2.15", "1.25.4", "2", "2.5.0", "2.5.10", "2.5.10.4159", "10.5"]
, что совершенно одинаково, поскольку 0.0 и 0.0.0 считаются равными , что означает, что не имеет значения, является ли «0.0» перед «0.0.0» или наоборот.Взято с http://java.com/js/deployJava.js :
источник
Не могу найти функцию, которая делает то, что я хотел здесь. Поэтому я написал свой. Это мой вклад. Я надеюсь, что кто-то найдет это полезным.
Плюсы:
Обрабатывает строки версии произвольной длины. «1» или «1.1.1.1.1».
По умолчанию каждое значение равно 0, если не указано. То, что строка длиннее, не означает, что она больше. («1» должно совпадать с «1.0» и «1.0.0.0».)
Сравните числа, а не строки. («3» <«21» должно быть истинным. Не ложным.)
Не тратьте время на бесполезные сравнения в цикле. (Сравнение для ==)
Вы можете выбрать свой собственный компаратор.
Минусы:
Мой код, похожий на принятый ответ Джона :
Примеры :
источник
Простая и короткая функция:
тесты:
источник
Простите, если эту идею уже посещали по ссылке, которую я не видел.
У меня был некоторый успех с преобразованием частей в взвешенную сумму следующим образом:
Что сделало сравнения очень легкими (сравнение двойного). Наши поля версии никогда не превышают 4 цифры.
Я надеюсь, что это кому-то поможет, так как несколько условных выражений кажутся немного излишними.
источник
Вот еще одна короткая версия, которая работает с любым количеством подверсий, дополненными нулями и даже числами с буквами (1.0.0b3)
Вывод:
0 : a = b
1 : a> b
-1 : a <b
Показать фрагмент кода
https://jsfiddle.net/vanowm/p7uvtbor/
источник
Ответ 2017 года:
Простейший код для современных браузеров:
Идея здесь состоит в том, чтобы сравнить числа, но в форме строки. чтобы сравнение работало, две строки должны быть одинаковой длины. так:
"123" > "99"
становиться"123" > "099"
короткий номер "исправить" сравнение
Здесь я дополняю каждую часть нулями до длины 10. Затем просто используйте сравнение строк для ответа
Пример :
источник
compareVersion2
что именно происходит?substring
вместоpadStart
лучшей совместимости, т.е.var zeros = "0000000000"; '0.2.32'.split('.').map( s => zeros.substring(0, zeros.length-s.length) + s ).join('.')
даст вам0000000000.0000000002.0000000032
:)Проверьте функцию
version_compare()
от проекта php.js . Это похоже на PHPversion_compare()
.Вы можете просто использовать это так:
источник
Мой менее подробный ответ, чем большинство ответов здесь
источник
Хотя в этом вопросе уже много ответов, каждый продвигает свое собственное решение, созданное на заднем дворе, в то время как для этого у нас есть целая экосистема (протестированных) библиотек.
Быстрый поиск по NPM , GitHub , X даст нам несколько прекрасных библиотек, и я бы хотел пробежаться по ним:
semver-compare
это большая легковесная (~ 230B) библиотека, которая особенно полезна, если вы хотите отсортировать по номерам версий, как показывает возвращаемый метод библиотеки-1
,0
или1
соответственно.Ядро библиотеки:
compare-semver
довольно большой по размеру (~ 4.4kB в сжатом виде), но позволяет провести несколько приятных уникальных сравнений, таких как поиск минимума / максимума в стеке версий или выяснение, является ли предоставленная версия уникальной или меньше, чем что-либо еще в коллекции версии.compare-versions
это еще одна небольшая библиотека (~ 630B gzipped), которая хорошо соответствует спецификации, то есть вы можете сравнить версии с флагами альфа / бета и даже с подстановочными знаками (как для минорных версий / версий патча:1.0.x
или1.0.*
)Суть в том, что не всегда нужно копировать и вставлять код из StackOverflow, если вы можете найти достойные ( проверенные модулем) версии с помощью выбранного вами менеджера пакетов.
источник
Я столкнулся с подобной проблемой, и я уже создал решение для нее. Не стесняйтесь попробовать.
Возвращает
0
дляequal
,1
если версияgreater
и-1
если этоless
источник
Идея состоит в том, чтобы сравнить две версии и знать, какая из них самая большая. Мы удаляем "." и мы сравниваем каждую позицию вектора с другой.
источник
источник
replace()
Функция заменяет только первое вхождение в строке. Таким образом, позволяет заменить.
с,
. После этого удалить все.
и сделать ,,
чтобы.
снова и разобрать его , чтобы плавать.наконец, сортируйте это:
источник
Проверьте это сообщение в блоге . Эта функция работает для числовых номеров версий.
источник
Если, например, мы хотим проверить, является ли текущая версия jQuery меньше чем 1.8,
parseFloat($.ui.version) < 1.8 )
это даст неверный результат, если версия «1.10.1», так как parseFloat («1.10.1») возвращает1.1
. Строка сравнение также ошибется, так как имеет"1.8" < "1.10"
значениеfalse
.Итак, нам нужен такой тест
Следующая функция обрабатывает это правильно:
Вот некоторые примеры:
Смотрите здесь для живого примера и набора тестов: http://jsfiddle.net/mar10/8KjvP/
источник
Вот реализация coffeescript, подходящая для использования с Array.sort, вдохновленная другими ответами здесь:
источник
Я написал модуль узла для сортировки версий, вы можете найти его здесь: version-sort
Особенности :
Не стесняйтесь открыть вопрос, если вам нужна другая функция.
источник
Это работает для числовых версий любой длины, разделенных точкой. Он возвращает true только в том случае, если myVersion> >imumVersion>, предполагая, что версия 1 меньше 1.0, версия 1.1 меньше 1.1.0 и так далее. Должно быть довольно просто добавить дополнительные условия, такие как принятие чисел (просто преобразовать в строку) и шестнадцатеричное или динамический разделитель (просто добавьте параметр разделителя, затем замените «.» На параметр)
Вот несколько тестов:
В качестве альтернативы здесь есть рекурсивная версия
источник
Я нахожу самый простой способ сравнить их, не уверен, что это то, что вы хотите. когда я запускаю приведенный ниже код в консоли, это имеет смысл, и, используя метод sort (), я могу получить отсортированный массив строк версий. это основано на алфавитном порядке.
источник
Вы могли бы использовать
String#localeCompare
сoptions
источник
undefined
выше, язык? Почему вы можете опубликовать это, пока я читаю остальных;)undefined
является частью локали, здесь не используется.Не могли бы вы преобразовать их в числа, а затем отсортировать по размеру? Добавьте 0 к номерам, длина которых <4
поиграл в консоли:
Чем больше версия, тем больше число. Редактировать: вероятно, необходимо настроить для учета большей серии версий
источник
Это изящный трюк. Если вы имеете дело с числовыми значениями, между определенным диапазоном значений вы можете назначить значение каждому уровню объекта версии. Например, "largeValue" здесь имеет значение 0xFF, что создает очень "IP" вид вашего контроля версий.
Это также обрабатывает буквенно-цифровое управление версиями (т.е. 1.2a <1.2b)
источник
Мне нравится версия от @ mar10 , хотя, с моей точки зрения, есть вероятность неправильного использования (кажется, что это не тот случай, если версии совместимы с документом семантического контроля версий , но может быть и в случае использования некоторого «номера сборки»). ):
Проблема здесь в том, что под номера номера версии в некоторых случаях записываются с вырезанными конечными нулями (по крайней мере, как я недавно это видел при использовании другого программного обеспечения), что похоже на рациональную часть числа, поэтому:
Однако первый (или оба, первый и второй) под номера версии всегда обрабатываются как целочисленное значение, которому они фактически равны.
Если вы используете этот тип управления версиями, вы можете изменить всего несколько строк в примере:
Таким образом, каждый под-номер, кроме первого, будет сравниваться как число с плавающей запятой, а значит
09
и1
станет0.09
и,0.1
соответственно , и будет соответствующим образом сопоставлен.2054
и3
станет0.2054
и0.3
.Полная версия тогда (кредиты @ mar10 ):
PS Медленнее, но также можно подумать о повторном использовании той же функции сравнения, работающей на том факте, что строка на самом деле является массивом символов:
источник
Я сделал это, основываясь на идее Kons, и оптимизировал ее для версии Java 1.7.0_45. Это просто функция, предназначенная для преобразования строки версии в число с плавающей точкой. Это функция:
Строка «1.7.0_45» преобразуется в 1.0070000450000001, и этого достаточно для нормального сравнения. Ошибка объясняется здесь: как бороться с точностью чисел с плавающей точкой в JavaScript? , Если нужно более 3 цифр на любой части, вы можете изменить разделитель
Math.pow(10, i * 3);
.Вывод будет выглядеть так:
источник
У меня была та же проблема сравнения версий, но с версиями, возможно, содержащими что-либо (то есть: разделители, которые не были точками, расширения как rc1, rc2 ...).
Я использовал это, что в основном делит строки версии на числа и не числа, и пытается сравнить соответственно типу.
Здесь есть некоторые допущения для некоторых случаев, например: «1.01» === «1.1» или «1.8» <«1.71». Он не может управлять "1.0.0-rc.1" <"1.0.0", как указано в Semantic versionning 2.0.0
источник
Предварительная обработка версий перед сортировкой означает, что parseInt не вызывается без необходимости несколько раз. Используя Array # map, аналогичную предложению Майкла Дила, вот что я использую, чтобы найти новейшую версию стандартного трехчастного сервера:
источник