자바스크립트 strcmp()가 있습니까?
누가 이것을 확인해 줄 수 있습니까?자바스크립트에는 strcmp() 버전이 없으므로 다음과 같은 내용을 작성해야 합니다.
( str1 < str2 ) ?
-1 :
( str1 > str2 ? 1 : 0 );
어때
str1.localeCompare(str2)
지적하신 대로 자바스크립트에는 없습니다.
빠른 검색 결과 다음과 같은 결과가 나왔습니다.
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/ 에서
물론 필요한 경우 localCompare를 추가할 수 있습니다.
if (typeof(String.prototype.localeCompare) === 'undefined') {
String.prototype.localeCompare = function(str, locale, options) {
return ((this == str) ? 0 : ((this > str) ? 1 : -1));
};
}
그리고 사용.str1.localeCompare(str2)
로컬 브라우저가 함께 제공되었는지 걱정할 필요 없이 모든 곳에서 사용할 수 있습니다.유일한 문제는 당신이 그것에 대해 관심이 있다면 지원을 추가해야 한다는 것입니다.
localeCompare()
속도가 느리기 때문에 영어가 아닌 문자열의 "올바른" 순서를 신경 쓰지 않는다면 원래 방법이나 더 깨끗하게 보이는 방법을 사용해 보십시오.
str1 < str2 ? -1 : +(str1 > str2)
이것은 보다 훨씬 빠른 속도입니다.localeCompare()
내 기계에.
그+
답이 부울이 아닌 숫자여야 합니다.
var strcmp = new Intl.Collator(undefined, {numeric:true, sensitivity:'base'}).compare;
용도:strcmp(string1, string2)
결과:1
문자열 1이 더 크다는 뜻입니다.0
같음을 의미하며,-1
문자열 2가 더 크다는 뜻입니다.
이것은 보다 더 높은 성능을 갖습니다.String.prototype.localeCompare
또한.numeric:true
논리적인 숫자를 비교하게 합니다.
이 문서에서 자바스크립트에서 두 문자열이 동일한지 확인하는 방법:
- 일반적으로 문자열에 ASCII 문자만 포함된 경우
===
연산자가 동일한지 여부를 확인합니다. - 그러나 문자열에 결합 문자가 포함되어 있는 경우(예:
e + ◌́ = é
), 다음과 같이 동등성을 비교하기 전에 먼저 정규화합니다.s1.normalize() === s2.normalize()
그래서 나는 이 토끼굴에 빠져 직관을 쌓기 위해 몇 가지 테스트를 작성했는데, 결과가 이상합니다. tldr 로케일 비교 - 동등 연산자가 수행하지 않는 소문자로 보입니다.그러면 "off"가 >= "ZZ"가 되지만 local Compare는 "off" <= 'zz'이므로 -1을 반환합니다.
최상의 결과를 얻으려면 브라우저 콘솔의 코드 로그를 확인합니다. ctrl + shift + i
두번째 저격은 손 검사를 숨겨서 무작위로 볼 수 있습니다.
홈 이것은 누군가를 돕습니다.
function stringBench(n, bench, min = 10, len = 10, logDif = false) {
function makeid(length) {
var result = '';
var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
var charactersLength = characters.length;
for (var i = 0; i < length; i++) {
result += characters.charAt(Math.floor(Math.random() *
charactersLength));
}
return result;
}
var a = [];
var b = [];
var pool = {};
let rle = [];
let rlc = [];
let now;
for (let i = 0; i < n; i++) {
pool[i] = (makeid(min + Math.floor(Math.random() *
len))); //10-20ish
}
for (let i = 0; i < bench; i++) {
a[i] = (Math.floor(Math.random() * n));
b[i] = (Math.floor(Math.random() * n));
}
console.log("now testin le vs lc on a pool of", n, " with this many samples ", bench);
now = Date.now();
for (let i = 0; i < bench; i++) {
rlc[i] = pool[a[i]].localeCompare(pool[b[i]]);
}
let lcDelta = Date.now() - now;
console.log("Performed ", bench, "lc localeCompare in ", lcDelta);
now = Date.now();
for (let i = 0; i < bench; i++) {
rle[i] = pool[a[i]] <= pool[b[i]];
}
let leDelta = Date.now() - now;
console.log("Performed ", bench, "le (<=) compares in ", leDelta)
for (let i = 0; i < n; i++) {
pool[i] = (makeid(min + Math.floor(Math.random() *
len))); //10-20ish
}
for (let i = 0; i < bench; i++) {
a[i] = (Math.floor(Math.random() * n));
b[i] = (Math.floor(Math.random() * n));
}
now = Date.now();
for (let i = 0; i < bench; i++) {
rle[i] = pool[a[i]] <= pool[b[i]];
}
let leDelta2 = Date.now() - now;
console.log("Performed ", bench, "le (<=) compares in ", leDelta2)
now = Date.now();
for (let i = 0; i < bench; i++) {
rlc[i] = pool[a[i]].localeCompare(pool[b[i]]);
}
let lcDelta2 = Date.now() - now;
console.log("Performed ", bench, "lc localeCompare in ", lcDelta2);
function testCmp(a, b, log = true) {
let le = a <= b;
let ge = a >= b;
let lc = a.localeCompare(b);
let l = a < b;
let g = a > b;
if (le && ge) console.assert(lc == 0, 'le && ge -> == -> lc == 0,')
if (le) console.assert(lc <= 0, 'le-> lc <= 0')
if (ge) console.assert(lc >= 0, 'ge-> lc >= 0')
if (l) console.assert(lc < 0, 'l=>lc < 0')
if (g) console.assert(lc > 0, 'g-> lc > 0')
if (!log) return;
console.log(`Compare: ${a} le ${b} `, a <= b);
console.log(`Compare: ${a} ge ${b}`, a >= b);
console.log(`Compare: ${a} lc ${b}`, a.localeCompare(b));
}
let c = 0
for (let i = 0; i < bench; i++) {
if (rle[i] != rlc[i] <= 0) {
c++;
testCmp(pool[a[i]], pool[b[i]], true);
console.warn(pool[a[i]], ' le != lc <= 0 ', pool[b[i]]);
}
// rlc[i] = pool[a[i]].localeCompare(pool[b[i]]);
}
console.warn(' le != lc out of bench, num diffs: ', c);
testCmp('ff', 'ff')
testCmp('ff', 'fa')
testCmp('ff', 'fz')
testCmp('ff', 'fff')
testCmp('ff', 'ffa')
testCmp('ff', 'ffz')
testCmp('ff', 'a')
testCmp('ff', 'z')
testCmp('ff', 'f')
testCmp('ff', 'zff')
testCmp('ff', 'aff')
testCmp('ff', 'ZZ')
testCmp('ff', 'AA')
testCmp('FF', 'ZZ')
testCmp('FF', 'ff')
testCmp('FF', 'AA')
testCmp('ff', 'ZZZ')
console.log("Dif le - lc = ", leDelta2 - lcDelta2);
console.log("avg le ms/Mops = ", (leDelta + leDelta2) / (bench / 1000000));
console.log("avg lc ms/Mops = ", (lcDelta + lcDelta2) / (bench / 1000000));
console.log("Dif - lc = ", leDelta2 - lcDelta2);
};
stringBench(1000, 5000, 1, 3, true);
// stringBench(1000000, 1000000);//nothing is equire
// stringBench(1000, 100000000);
// stringBench(1000000, 100000000, 3, 5);
// stringBench(1000000, 100000000, 15, 20);
function stringBench(n, bench, min = 10, len = 10, logDif = false) {
function makeid(length) {
var result = '';
var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
var charactersLength = characters.length;
for (var i = 0; i < length; i++) {
result += characters.charAt(Math.floor(Math.random() *
charactersLength));
}
return result;
}
var a = [];
var b = [];
var pool = {};
let rle = [];
let rlc = [];
let now;
for (let i = 0; i < n; i++) {
pool[i] = (makeid(min + Math.floor(Math.random() *
len))); //10-20ish
}
for (let i = 0; i < bench; i++) {
a[i] = (Math.floor(Math.random() * n));
b[i] = (Math.floor(Math.random() * n));
}
console.log("now testin le vs lc on a pool of", n, " with this many samples ", bench);
now = Date.now();
for (let i = 0; i < bench; i++) {
rlc[i] = pool[a[i]].localeCompare(pool[b[i]]);
}
let lcDelta = Date.now() - now;
console.log("Performed ", bench, "lc localeCompare in ", lcDelta);
now = Date.now();
for (let i = 0; i < bench; i++) {
rle[i] = pool[a[i]] <= pool[b[i]];
}
let leDelta = Date.now() - now;
console.log("Performed ", bench, "le (<=) compares in ", leDelta)
for (let i = 0; i < n; i++) {
pool[i] = (makeid(min + Math.floor(Math.random() *
len))); //10-20ish
}
for (let i = 0; i < bench; i++) {
a[i] = (Math.floor(Math.random() * n));
b[i] = (Math.floor(Math.random() * n));
}
now = Date.now();
for (let i = 0; i < bench; i++) {
rle[i] = pool[a[i]] <= pool[b[i]];
}
let leDelta2 = Date.now() - now;
console.log("Performed ", bench, "le (<=) compares in ", leDelta2)
now = Date.now();
for (let i = 0; i < bench; i++) {
rlc[i] = pool[a[i]].localeCompare(pool[b[i]]);
}
let lcDelta2 = Date.now() - now;
console.log("Performed ", bench, "lc localeCompare in ", lcDelta2);
function testCmp(a, b, log = true) {
let le = a <= b;
let ge = a >= b;
let lc = a.localeCompare(b);
let l = a < b;
let g = a > b;
if (le && ge) console.assert(lc == 0, 'le && ge -> == -> lc == 0,')
if (le) console.assert(lc <= 0, 'le-> lc <= 0')
if (ge) console.assert(lc >= 0, 'ge-> lc >= 0')
if (l) console.assert(lc < 0, 'l=>lc < 0')
if (g) console.assert(lc > 0, 'g-> lc > 0')
if (!log) return;
console.log(`Compare: ${a} le ${b} `, a <= b);
console.log(`Compare: ${a} ge ${b}`, a >= b);
console.log(`Compare: ${a} lc ${b}`, a.localeCompare(b));
}
let c = 0
for (let i = 0; i < bench; i++) {
if (rle[i] != rlc[i] <= 0) {
c++;
testCmp(pool[a[i]], pool[b[i]], true);
console.warn(pool[a[i]], ' le != lc <= 0 ', pool[b[i]]);
}
// rlc[i] = pool[a[i]].localeCompare(pool[b[i]]);
}
console.warn(' le != lc out of bench, num diffs: ', c);
testCmp('ff', 'fa')
testCmp('ff', 'fz')
testCmp('ff', 'ZZ')
console.log("Dif le - lc = ", leDelta2 - lcDelta2);
console.log("avg le ms/Mops = ", (leDelta + leDelta2) / (bench / 1000000));
console.log("avg lc ms/Mops = ", (lcDelta + lcDelta2) / (bench / 1000000));
console.log("Dif - lc = ", leDelta2 - lcDelta2);
// for (let i = 0; i < bench; i++) {
// rlc[i] != rle[i]
// pool[a[i]].localeCompare(pool[b[i]]);
// }
//
// console.log(makeid(5));
};
stringBench(1000, 5000, 1, 3, true);
// stringBench(1000000, 1000000);//nothing is equire
// stringBench(1000, 100000000);
// stringBench(1000000, 100000000, 3, 5);
// stringBench(1000000, 100000000, 15, 20);
제 테스트에서는 무작위로 선택된 단어 집합에 삼항문 쌍을 사용하는 것보다 약 10% 빠릅니다.
function strcmp( a, b ) {
for( let i=0 ; i<Math.min( a.length, b.length ) ; i++ ) {
const n = a.charCodeAt(i) - b.charCodeAt(i);
if( n ) return n && ( ( n>>31 ) || 1 );
}
const n = a.length - b.length;
return n && ( ( n>>31 ) || 1 );
}
다음은 어떻습니까?
String.prototype.strcmp = function(s) {
if (this < s) return -1;
if (this > s) return 1;
return 0;
}
그런 다음 s1과 2를 비교합니다.
s1.strcmp(s2)
언급URL : https://stackoverflow.com/questions/1179366/is-there-a-javascript-strcmp
'programing' 카테고리의 다른 글
MySQL/MariaDB GET_LOCK 라이프사이클 with Events (0) | 2023.09.06 |
---|---|
뷰의 오른쪽 여백을 프로그래밍 방식으로 변경하시겠습니까? (0) | 2023.09.06 |
Administrator(관리자)로 로그인한 경우에도 파일을(를) (0) | 2023.09.06 |
Vue.js에서 /deep/ 또는 >> 또는 ::v-deep을 어떻게 사용합니까? (0) | 2023.09.06 |
Get-child 항목을 사용하여 지난 3일 동안 수정된 파일 목록 가져오기 (0) | 2023.09.06 |