แก้ไข : คำตอบนี้ถูกเพิ่มเดิม 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 อาจทำให้การจับคู่ไม่ถูกต้องหรือการจับคู่ล้มเหลวหากสตริงมี regex พิเศษ ตัวละครในนั้น
หากคุณสนใจเกี่ยวกับความเป็นสากลอย่าใช้toLowerCase()
หรือtoUpperCase()
ไม่ได้ให้การเปรียบเทียบแบบตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ในทุกภาษา
http://www.i18nguy.com/unicode/turkish-i18n.html
.localeCompare()
วิธีการเพิ่มจาวาสคริปต์ รองรับเฉพาะเบราว์เซอร์ที่ทันสมัยในขณะที่เขียน (IE11 +) ดูdeveloper.mozilla.org/en-US/docs/Web/JavaScript/Reference/