EDIT : Ця відповідь спочатку була додана 9 років тому. Сьогодні ви повинні використовувати localeCompare
з 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'));
{ sensitivity: 'accent' }
Каже localeCompare()
лікувати два варіанти однієї і тієї ж базової буквою, то ж , якщо вони не мають різні акценти (як в третьому прикладі) вище.
Крім того, ви можете використовувати { sensitivity: 'base' }
, що трактує два символи як еквівалент, до тих пір, поки їх базовий символ є однаковим (так A
би трактувався як еквівалент á
).
Зауважте, що третій параметр localeCompare
не підтримується в IE10 або нижчих або певних мобільних браузерах (див. Діаграму сумісності на сторінці, що пов’язана вище), тому якщо вам потрібно підтримати ці браузери, вам знадобиться певна резервна версія:
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 */;
}
Оригінальна відповідь
Найкращий спосіб порівняння з невідчутним до обліку випадків у JavaScript - це використовувати match()
метод RegExp з i
прапором.
Пошуковий нечутливий пошук
Коли обидва рядки, що порівнюються, є змінними (а не константами), то це трохи складніше, тому що вам потрібно генерувати RegExp з рядка, але передача рядка конструктору RegExp може призвести до неправильних збігів або збійних збігів, якщо рядок має спеціальний регулярний вираз символи в ній.
Якщо ви дбаєте про інтернаціоналізацію, не використовуйте toLowerCase()
або, toUpperCase()
оскільки це не дає точних нечутливих до випадків порівнянь на всіх мовах.
http://www.i18nguy.com/unicode/turkish-i18n.html
.localeCompare()
метод javascript. Підтримується лише сучасними браузерами під час написання (IE11 +). дивіться developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…