Ответ 1
Что насчет
str1.localeCompare(str2)
Может ли кто-нибудь проверить это для меня? JavaScript не имеет версии strcmp(), поэтому вам нужно написать что-то вроде:
( str1 < str2 ) ?
-1 :
( str1 > str2 ? 1 : 0 );
Что насчет
str1.localeCompare(str2)
Javascript не имеет его, как вы указываете.
Быстрый поиск:
function strcmp ( str1, str2 ) {
// http://kevin.vanzonneveld.net
// + original by: Waldo Malqui Silva
// + input by: Steve Hilder
// + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + revised by: gorthaur
// * example 1: strcmp( 'waldo', 'owald' );
// * returns 1: 1
// * example 2: strcmp( 'owald', 'waldo' );
// * returns 2: -1
return ( ( str1 == str2 ) ? 0 : ( ( str1 > str2 ) ? 1 : -1 ) );
}
из http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_strcmp/
Конечно, вы можете просто добавить localeCompare при необходимости:
if (typeof(String.prototype.localeCompare) === 'undefined') {
String.prototype.localeCompare = function(str, locale, options) {
return ((this == str) ? 0 : ((this > str) ? 1 : -1));
};
}
И используйте str1.localeCompare(str2)
везде, не беспокоясь о том, что локальный браузер отправил его. Единственная проблема заключается в том, что вам следует добавить поддержку locales
и options
, если вам это интересно.
localeCompare()
медленный, поэтому, если вам не нужно "правильное" упорядочение строк, отличных от английского, попробуйте свой оригинальный метод или уборщик вид:
str1 < str2 ? -1 : +(str1 > str2)
Это на порядок быстрее, чем localeCompare()
на моей машине.
+
гарантирует, что ответ всегда является числовым, а не логическим.
Как насчет:
String.prototype.strcmp = function(s) {
if (this < s) return -1;
if (this > s) return 1;
return 0;
}
Затем, чтобы сравнить s1 с 2:
s1.strcmp(s2)
Попробуйте это более компактное и понятное выражение
(a>b)-(a<b)
Это ок. 50% медленнее, чем
(a<b)?-1:((a>b)?1:0)
var strcmp = new Intl.Collator(undefined, {numeric:true, sensitivity:'base'}).compare;
Использование: strcmp(string1, string2)
Результат: 1
означает, что строка1 больше, 0
означает равенство, -1
означает, что -1
больше.
Это имеет более высокую производительность, чем String.prototype.localeCompare
Кроме того, numeric:true
делает сравнение логических чисел
Это дает поведение, которое вы ищете:
function strcmp(str1,str2){
return str1.localeCompare(str2)/Math.abs(str1.localeCompare(str2));
}