Kaip "JavaScript" atlikti eilučių palyginimą, neatsižvelgiant į mažųjų ir didžiųjų raidžių skirtumus?
EDIT: Šis atsakymas buvo pridėtas prieš 9 metus. Šiandien turėtumėte naudoti `localeCompare
su parinktimi sensitivity: 'accent'
:
function ciEquals(a, b) {
return typeof a === 'string' && typeof b === 'string'
? a.localeCompare(b, undefined, { sensitivity: 'accent' }) === 0
: a === b;
}
console.log("'a' = 'a'?", ciEquals('a', 'a'));
console.log("'AaA' = 'aAa'?", ciEquals('AaA', 'aAa'));
console.log("'a' = 'á'?", ciEquals('a', 'á'));
console.log("'a' = 'b'?", ciEquals('a', 'b'));
{ jautrumas: 'akcentas' }
nurodo localeCompare()
du tos pačios bazinės raidės variantus laikyti vienodais, jei jie neturi skirtingų akcentų (kaip trečiajame pavyzdyje).
Arba galite naudoti { sensitivity: 'base' }
, kuris du ženklus laiko lygiaverčiais, jei jų bazinis ženklas yra tas pats (taigi A
būtų laikoma lygiaverte á
).
Atkreipkite dėmesį, kad trečiasis localeCompare
parametras nepalaikomas IE10 ar žemesnėse arba tam tikrose mobiliosiose naršyklėse (žr. suderinamumo lentelę puslapyje, į kurį nuoroda pateikta pirmiau), todėl, jei reikia palaikyti šias naršykles, jums reikės kokios nors atsarginės priemonės:
function ciEqualsInner(a, b) {
return a.localeCompare(b, undefined, { sensitivity: 'accent' }) === 0;
}
function ciEquals(a, b) {
if (typeof a !== 'string' || typeof b !== 'string') {
return a === b;
}
// v--- feature detection
return ciEqualsInner('A', 'a')
? ciEqualsInner(a, b)
: /* fallback approach here */;
}
Pradinis atsakymas
Geriausias būdas "JavaScript" sistemoje atlikti palyginimą, neatsižvelgiant į mažųjų ir didžiųjų raidžių skirtumus, yra naudoti "RegExp" match()
metodą su i
vėliavėle.
https://stackoverflow.com/questions/177719/javascript-case-insensitive-search
Kai abi lyginamos eilutės yra kintamieji (o ne konstantos), tada'tai šiek tiek sudėtingiau, nes iš eilutės reikia sugeneruoti RegExp, tačiau, perdavus eilutę RegExp konstruktoriui, gali būti neteisingų atitikmenų arba nepavykusių atitikmenų, jei eilutėje yra specialių regex simbolių.
Jei rūpinatės internacionalizacija, nenaudokite toLowerCase()
arba toUpperCase()
, nes ne visomis kalbomis galima atlikti tikslius palyginimus, neatsižvelgiant į mažąsias ir didžiąsias raides.