45

necesito para comparar 2 cadenas, como la igualdad como éstas:Reducción Programáticos acento en JavaScript (también conocido como la normalización de texto o unaccenting)

== Lübeck Lübeck

En JavaScript.

¿Por qué? Bueno, tengo un campo auto-realización que va a un servicio de Java utilizando Lucene, donde los nombres de lugares se almacenan de forma natural (como Lübeck), sino también indexado como texto normalizado,

import sun.text.Normalizer; 
oDoc.setNameLC = Normalizer.normalize(oLocName, Normalizer.DECOMP, 0) 
    .toLowerCase().replaceAll("[^\\p{ASCII}]",""); 

De esta manera alguna, uno que no sabe escribir "Mèxico" puede escribir "mexico" y obtener una coincidencia que devuelve "Mèxico" (entre muchos otros posibles éxitos, como "Café Mèxico, Dubai, Emiratos Árabes Unidos").

Ahora la cosa es que no tengo la capacidad de cambiar el servicio para hacer cualquier resaltado en el lado del servidor, por lo tanto, me destaco en el cliente JavaScript lado con algo como:

return result.replace(input.replace(/[aeiou]/g,"."), "<b>$1</b>"); 

Es una un poco más elegante porque estoy escapando caracteres especiales de expresiones regulares en la entrada. Esto está bien para una sencilla palabra coincide en el comienzo de un éxito, pero en realidad se descompone si de repente desea apoyar varias palabras partidos como "café de Londres":

input = input.strip().toLowerCase(); //fyi prototype's strip is like trim 
re = new RegEx(input.replace(/[aeiou]/g,".").replace(/\s+/g,"|"),"gi"); 
return result.replace(re, "<b>$1</b>"); 

Esto no funciona para la opinión "london ca" (estaba escribiendo london cafe), porque marcaría "Jack London Cabin, Dawson City, Canada" como: "Ja<b>ck</b> <b>London</b> <b>ca</b>bin, Dawson <b>Ci</b>ty, <b>Ca<b/>nada" [tenga en cuenta "ck" y "Ci" en particular]

Por lo tanto, estoy un poco buscando algo que no es tan loco como:

input = input.strip().toLowerCase(); 
input = input.replace(/a/g,"[ÀàÁáÂâÃãÄäÅåÆæĀāĂ㥹]"); 
input = input.replace(/e/g,"[ÈèÉéÊêËëĒēĔĕĖėĘęĚě]"); 
// ditto for i, o, u, y, c, n, maybe also d, g, h, j, k, l, r, s, t, w, z 
re = new RegEx(input.replace(/\s+/g,"|"),"gi"); 
return result.replace(re, "<b>$1</b>"); 

¿Hay un compilado En la tabla me puedo referir a la asignación de un rango de caracteres que son versiones acentuadas de otro carácter a ese carácter, por lo que no me refiero al gráfico Unicode simple. Y si es así, ¿podría evitar el uso de declaraciones RegEx extrañas, posiblemente lentas?

Sobre la generosidad:
Antes de empezar una recompensa había dos respuestas, el que me apuntando a hacerlo en Ruby, y the one que MizzardX escribió que era un término de la forma básica que había puesto en mi pregunta. Ahora no me malinterpreten, realmente aprecio resolverlo tan completamente como él lo hizo, pero solo deseé que pudiera haber otra manera. Hasta ahora, parece que todos los que han pasado por aquí para ver la pregunta y la respuesta han decidido que MizzardX lo cubre muy bien, o que no tienen un enfoque diferente. Me interesaría un enfoque diferente, y si simplemente no está disponible antes de que se cierre la recompensa, MizzardX ganará la recompensa (aunque en un giro cruel, sus ediciones fueron una respuesta wiki de la comunidad, así que no estoy seguro si ¡obtendrá la recompensa!)

+1

Buena pregunta. Algo como esto sería útil en los scripts de autocompletado de JavaScript, como el complemento de autocompletar de jQuery UI: http://docs.jquery.com/UI/Autocomplete –

+0

todavía en este problema 11 meses después? gorrón. – nickf

+0

re: 11 meses. De alguna manera surgió de nuevo. – dlamblin

Respuesta

40
/** 
* Creates a RegExp that matches the words in the search string. 
* Case and accent insensitive. 
*/ 
function make_pattern(search_string) { 
    // escape meta characters 
    search_string = search_string.replace(/([|()[{.+*?^$\\])/g,"\\$1"); 

    // split into words 
    var words = search_string.split(/\s+/); 

    // sort by length 
    var length_comp = function (a,b) { 
     return b.length - a.length; 
    }; 
    words.sort(length_comp); 

    // replace characters by their compositors 
    var accent_replacer = function(chr) { 
     return accented[chr.toUpperCase()] || chr; 
    } 
    for (var i = 0; i < words.length; i++) { 
     words[i] = words[i].replace(/\S/g,accent_replacer); 
    } 

    // join as alternatives 
    var regexp = words.join("|"); 
    return new RegExp(regexp,'g'); 
} 

var accented = { 
    'A': '[Aa\xaa\xc0-\xc5\xe0-\xe5\u0100-\u0105\u01cd\u01ce\u0200-\u0203\u0226\u0227\u1d2c\u1d43\u1e00\u1e01\u1e9a\u1ea0-\u1ea3\u2090\u2100\u2101\u213b\u249c\u24b6\u24d0\u3371-\u3374\u3380-\u3384\u3388\u3389\u33a9-\u33af\u33c2\u33ca\u33df\u33ff\uff21\uff41]', 
    'B': '[Bb\u1d2e\u1d47\u1e02-\u1e07\u212c\u249d\u24b7\u24d1\u3374\u3385-\u3387\u33c3\u33c8\u33d4\u33dd\uff22\uff42]', 
    'C': '[Cc\xc7\xe7\u0106-\u010d\u1d9c\u2100\u2102\u2103\u2105\u2106\u212d\u216d\u217d\u249e\u24b8\u24d2\u3376\u3388\u3389\u339d\u33a0\u33a4\u33c4-\u33c7\uff23\uff43]', 
    'D': '[Dd\u010e\u010f\u01c4-\u01c6\u01f1-\u01f3\u1d30\u1d48\u1e0a-\u1e13\u2145\u2146\u216e\u217e\u249f\u24b9\u24d3\u32cf\u3372\u3377-\u3379\u3397\u33ad-\u33af\u33c5\u33c8\uff24\uff44]', 
    'E': '[Ee\xc8-\xcb\xe8-\xeb\u0112-\u011b\u0204-\u0207\u0228\u0229\u1d31\u1d49\u1e18-\u1e1b\u1eb8-\u1ebd\u2091\u2121\u212f\u2130\u2147\u24a0\u24ba\u24d4\u3250\u32cd\u32ce\uff25\uff45]', 
    'F': '[Ff\u1da0\u1e1e\u1e1f\u2109\u2131\u213b\u24a1\u24bb\u24d5\u338a-\u338c\u3399\ufb00-\ufb04\uff26\uff46]', 
    'G': '[Gg\u011c-\u0123\u01e6\u01e7\u01f4\u01f5\u1d33\u1d4d\u1e20\u1e21\u210a\u24a2\u24bc\u24d6\u32cc\u32cd\u3387\u338d-\u338f\u3393\u33ac\u33c6\u33c9\u33d2\u33ff\uff27\uff47]', 
    'H': '[Hh\u0124\u0125\u021e\u021f\u02b0\u1d34\u1e22-\u1e2b\u1e96\u210b-\u210e\u24a3\u24bd\u24d7\u32cc\u3371\u3390-\u3394\u33ca\u33cb\u33d7\uff28\uff48]', 
    'I': '[Ii\xcc-\xcf\xec-\xef\u0128-\u0130\u0132\u0133\u01cf\u01d0\u0208-\u020b\u1d35\u1d62\u1e2c\u1e2d\u1ec8-\u1ecb\u2071\u2110\u2111\u2139\u2148\u2160-\u2163\u2165-\u2168\u216a\u216b\u2170-\u2173\u2175-\u2178\u217a\u217b\u24a4\u24be\u24d8\u337a\u33cc\u33d5\ufb01\ufb03\uff29\uff49]', 
    'J': '[Jj\u0132-\u0135\u01c7-\u01cc\u01f0\u02b2\u1d36\u2149\u24a5\u24bf\u24d9\u2c7c\uff2a\uff4a]', 
    'K': '[Kk\u0136\u0137\u01e8\u01e9\u1d37\u1d4f\u1e30-\u1e35\u212a\u24a6\u24c0\u24da\u3384\u3385\u3389\u338f\u3391\u3398\u339e\u33a2\u33a6\u33aa\u33b8\u33be\u33c0\u33c6\u33cd-\u33cf\uff2b\uff4b]', 
    'L': '[Ll\u0139-\u0140\u01c7-\u01c9\u02e1\u1d38\u1e36\u1e37\u1e3a-\u1e3d\u2112\u2113\u2121\u216c\u217c\u24a7\u24c1\u24db\u32cf\u3388\u3389\u33d0-\u33d3\u33d5\u33d6\u33ff\ufb02\ufb04\uff2c\uff4c]', 
    'M': '[Mm\u1d39\u1d50\u1e3e-\u1e43\u2120\u2122\u2133\u216f\u217f\u24a8\u24c2\u24dc\u3377-\u3379\u3383\u3386\u338e\u3392\u3396\u3399-\u33a8\u33ab\u33b3\u33b7\u33b9\u33bd\u33bf\u33c1\u33c2\u33ce\u33d0\u33d4-\u33d6\u33d8\u33d9\u33de\u33df\uff2d\uff4d]', 
    'N': '[Nn\xd1\xf1\u0143-\u0149\u01ca-\u01cc\u01f8\u01f9\u1d3a\u1e44-\u1e4b\u207f\u2115\u2116\u24a9\u24c3\u24dd\u3381\u338b\u339a\u33b1\u33b5\u33bb\u33cc\u33d1\uff2e\uff4e]', 
    'O': '[Oo\xba\xd2-\xd6\xf2-\xf6\u014c-\u0151\u01a0\u01a1\u01d1\u01d2\u01ea\u01eb\u020c-\u020f\u022e\u022f\u1d3c\u1d52\u1ecc-\u1ecf\u2092\u2105\u2116\u2134\u24aa\u24c4\u24de\u3375\u33c7\u33d2\u33d6\uff2f\uff4f]', 
    'P': '[Pp\u1d3e\u1d56\u1e54-\u1e57\u2119\u24ab\u24c5\u24df\u3250\u3371\u3376\u3380\u338a\u33a9-\u33ac\u33b0\u33b4\u33ba\u33cb\u33d7-\u33da\uff30\uff50]', 
    'Q': '[Qq\u211a\u24ac\u24c6\u24e0\u33c3\uff31\uff51]', 
    'R': '[Rr\u0154-\u0159\u0210-\u0213\u02b3\u1d3f\u1d63\u1e58-\u1e5b\u1e5e\u1e5f\u20a8\u211b-\u211d\u24ad\u24c7\u24e1\u32cd\u3374\u33ad-\u33af\u33da\u33db\uff32\uff52]', 
    'S': '[Ss\u015a-\u0161\u017f\u0218\u0219\u02e2\u1e60-\u1e63\u20a8\u2101\u2120\u24ae\u24c8\u24e2\u33a7\u33a8\u33ae-\u33b3\u33db\u33dc\ufb06\uff33\uff53]', 
    'T': '[Tt\u0162-\u0165\u021a\u021b\u1d40\u1d57\u1e6a-\u1e71\u1e97\u2121\u2122\u24af\u24c9\u24e3\u3250\u32cf\u3394\u33cf\ufb05\ufb06\uff34\uff54]', 
    'U': '[Uu\xd9-\xdc\xf9-\xfc\u0168-\u0173\u01af\u01b0\u01d3\u01d4\u0214-\u0217\u1d41\u1d58\u1d64\u1e72-\u1e77\u1ee4-\u1ee7\u2106\u24b0\u24ca\u24e4\u3373\u337a\uff35\uff55]', 
    'V': '[Vv\u1d5b\u1d65\u1e7c-\u1e7f\u2163-\u2167\u2173-\u2177\u24b1\u24cb\u24e5\u2c7d\u32ce\u3375\u33b4-\u33b9\u33dc\u33de\uff36\uff56]', 
    'W': '[Ww\u0174\u0175\u02b7\u1d42\u1e80-\u1e89\u1e98\u24b2\u24cc\u24e6\u33ba-\u33bf\u33dd\uff37\uff57]', 
    'X': '[Xx\u02e3\u1e8a-\u1e8d\u2093\u213b\u2168-\u216b\u2178-\u217b\u24b3\u24cd\u24e7\u33d3\uff38\uff58]', 
    'Y': '[Yy\xdd\xfd\xff\u0176-\u0178\u0232\u0233\u02b8\u1e8e\u1e8f\u1e99\u1ef2-\u1ef9\u24b4\u24ce\u24e8\u33c9\uff39\uff59]', 
    'Z': '[Zz\u0179-\u017e\u01f1-\u01f3\u1dbb\u1e90-\u1e95\u2124\u2128\u24b5\u24cf\u24e9\u3390-\u3394\uff3a\uff5a]' 
}; 
+3

Así que estás diciendo que no hay una estructura incorporada a Unicode donde podría reducir un carácter acentuado a sus componentes básicos usando máscaras de bits o algo así? Porque este tipo de datos 'var acentuados' es grande y potencialmente imposible de mantener. – dlamblin

+2

Puede generarlo desde una fuente oficial: ftp://ftp.unicode.org/Public/UNIDATA/UnicodeData.txt. Solo necesita ir a través de cada línea, y mirar los caracteres en el campo de composición. –

+0

¿Listaba todos los caracteres para mayor claridad? Por qué no reemplazar, por ejemplo, ''[Zz \ u0179 \ u017a \ u017b \ u017c \ u017d \ u017e \ u01f1 \ u01f2 \ u01f3 \ u1dbb \ u1e90 \ u1e91 \ u1e92 \ u1e93 \ u1e94 \ u1e95 \ u2124 \ u2128 \ u24b5 \ u24cf \ u24e9 \ u3390 \ u3391 \ u3393 \ u3393 \ u3394 \ uff3a \ uff5a] '' con funciones idénticas - ''[Zz \ u0179 \ u017e \ u01f1- \ u01f3 \ u1dbb \ u1e90- \ u1e95 \ u2124 \ u2128 \ u24b5 \ u24cf \ u24e9 \ u3390- \ u3394 \ uff3a \ uff5a] ''? – kangax

27

Una versión más completa con soporte sensible a mayúsculas, ligaduras y otras cosas. Fuente original en: http://lehelk.com/2011/05/06/script-to-remove-diacritics/

var defaultDiacriticsRemovalMap = [ 
    {'base':'A', 'letters':/[\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F]/g}, 
    {'base':'AA','letters':/[\uA732]/g}, 
    {'base':'AE','letters':/[\u00C6\u01FC\u01E2]/g}, 
    {'base':'AO','letters':/[\uA734]/g}, 
    {'base':'AU','letters':/[\uA736]/g}, 
    {'base':'AV','letters':/[\uA738\uA73A]/g}, 
    {'base':'AY','letters':/[\uA73C]/g}, 
    {'base':'B', 'letters':/[\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181]/g}, 
    {'base':'C', 'letters':/[\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E]/g}, 
    {'base':'D', 'letters':/[\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779]/g}, 
    {'base':'DZ','letters':/[\u01F1\u01C4]/g}, 
    {'base':'Dz','letters':/[\u01F2\u01C5]/g}, 
    {'base':'E', 'letters':/[\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E]/g}, 
    {'base':'F', 'letters':/[\u0046\u24BB\uFF26\u1E1E\u0191\uA77B]/g}, 
    {'base':'G', 'letters':/[\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E]/g}, 
    {'base':'H', 'letters':/[\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D]/g}, 
    {'base':'I', 'letters':/[\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197]/g}, 
    {'base':'J', 'letters':/[\u004A\u24BF\uFF2A\u0134\u0248]/g}, 
    {'base':'K', 'letters':/[\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2]/g}, 
    {'base':'L', 'letters':/[\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780]/g}, 
    {'base':'LJ','letters':/[\u01C7]/g}, 
    {'base':'Lj','letters':/[\u01C8]/g}, 
    {'base':'M', 'letters':/[\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C]/g}, 
    {'base':'N', 'letters':/[\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4]/g}, 
    {'base':'NJ','letters':/[\u01CA]/g}, 
    {'base':'Nj','letters':/[\u01CB]/g}, 
    {'base':'O', 'letters':/[\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C]/g}, 
    {'base':'OI','letters':/[\u01A2]/g}, 
    {'base':'OO','letters':/[\uA74E]/g}, 
    {'base':'OU','letters':/[\u0222]/g}, 
    {'base':'P', 'letters':/[\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754]/g}, 
    {'base':'Q', 'letters':/[\u0051\u24C6\uFF31\uA756\uA758\u024A]/g}, 
    {'base':'R', 'letters':/[\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782]/g}, 
    {'base':'S', 'letters':/[\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784]/g}, 
    {'base':'T', 'letters':/[\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786]/g}, 
    {'base':'TZ','letters':/[\uA728]/g}, 
    {'base':'U', 'letters':/[\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244]/g}, 
    {'base':'V', 'letters':/[\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245]/g}, 
    {'base':'VY','letters':/[\uA760]/g}, 
    {'base':'W', 'letters':/[\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72]/g}, 
    {'base':'X', 'letters':/[\u0058\u24CD\uFF38\u1E8A\u1E8C]/g}, 
    {'base':'Y', 'letters':/[\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE]/g}, 
    {'base':'Z', 'letters':/[\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762]/g}, 
    {'base':'a', 'letters':/[\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250]/g}, 
    {'base':'aa','letters':/[\uA733]/g}, 
    {'base':'ae','letters':/[\u00E6\u01FD\u01E3]/g}, 
    {'base':'ao','letters':/[\uA735]/g}, 
    {'base':'au','letters':/[\uA737]/g}, 
    {'base':'av','letters':/[\uA739\uA73B]/g}, 
    {'base':'ay','letters':/[\uA73D]/g}, 
    {'base':'b', 'letters':/[\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253]/g}, 
    {'base':'c', 'letters':/[\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184]/g}, 
    {'base':'d', 'letters':/[\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A]/g}, 
    {'base':'dz','letters':/[\u01F3\u01C6]/g}, 
    {'base':'e', 'letters':/[\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD]/g}, 
    {'base':'f', 'letters':/[\u0066\u24D5\uFF46\u1E1F\u0192\uA77C]/g}, 
    {'base':'g', 'letters':/[\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F]/g}, 
    {'base':'h', 'letters':/[\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265]/g}, 
    {'base':'hv','letters':/[\u0195]/g}, 
    {'base':'i', 'letters':/[\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131]/g}, 
    {'base':'j', 'letters':/[\u006A\u24D9\uFF4A\u0135\u01F0\u0249]/g}, 
    {'base':'k', 'letters':/[\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3]/g}, 
    {'base':'l', 'letters':/[\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747]/g}, 
    {'base':'lj','letters':/[\u01C9]/g}, 
    {'base':'m', 'letters':/[\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F]/g}, 
    {'base':'n', 'letters':/[\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5]/g}, 
    {'base':'nj','letters':/[\u01CC]/g}, 
    {'base':'o', 'letters':/[\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275]/g}, 
    {'base':'oi','letters':/[\u01A3]/g}, 
    {'base':'ou','letters':/[\u0223]/g}, 
    {'base':'oo','letters':/[\uA74F]/g}, 
    {'base':'p','letters':/[\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755]/g}, 
    {'base':'q','letters':/[\u0071\u24E0\uFF51\u024B\uA757\uA759]/g}, 
    {'base':'r','letters':/[\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783]/g}, 
    {'base':'s','letters':/[\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B]/g}, 
    {'base':'t','letters':/[\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787]/g}, 
    {'base':'tz','letters':/[\uA729]/g}, 
    {'base':'u','letters':/[\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289]/g}, 
    {'base':'v','letters':/[\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C]/g}, 
    {'base':'vy','letters':/[\uA761]/g}, 
    {'base':'w','letters':/[\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73]/g}, 
    {'base':'x','letters':/[\u0078\u24E7\uFF58\u1E8B\u1E8D]/g}, 
    {'base':'y','letters':/[\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF]/g}, 
    {'base':'z','letters':/[\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763]/g} 
]; 
var changes; 
function removeDiacritics (str) { 
    if(!changes) { 
     changes = defaultDiacriticsRemovalMap; 
    } 
    for(var i=0; i<changes.length; i++) { 
     str = str.replace(changes[i].letters, changes[i].base); 
    } 
    return str; 
} 
+2

Genial, pero ¿cuál es la función de los cambios var? Gracias – Lucabro

+0

sobre str.replace "Este método no cambia la cadena original". lo que significa que la var de "cambios" no es importante, ya que puedes tenerla directamente en el ámbito de removeDiacritics (str) actualicé tu código @khel – Miguel

Cuestiones relacionadas