Efficiently replace all accented characters in a string?

后端 未结 21 2834
别跟我提以往
别跟我提以往 2020-11-22 04:35

For a poor man\'s implementation of near-collation-correct sorting on the client side I need a JavaScript function that does efficient single character rep

21条回答
  •  刺人心
    刺人心 (楼主)
    2020-11-22 05:28

    I think this might work a little cleaner/better (though I haven't test it's performance):

    String.prototype.stripAccents = function() {
        var translate_re = /[àáâãäçèéêëìíîïñòóôõöùúûüýÿÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ]/g;
        var translate = 'aaaaaceeeeiiiinooooouuuuyyAAAAACEEEEIIIINOOOOOUUUUY';
        return (this.replace(translate_re, function(match){
            return translate.substr(translate_re.source.indexOf(match)-1, 1); })
        );
    };
    

    Or if you are still too worried about performance, let's get the best of both worlds:

    String.prototype.stripAccents = function() {
        var in_chrs =  'àáâãäçèéêëìíîïñòóôõöùúûüýÿÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ',
            out_chrs = 'aaaaaceeeeiiiinooooouuuuyyAAAAACEEEEIIIINOOOOOUUUUY', 
            transl = {};
        eval('var chars_rgx = /['+in_chrs+']/g');
        for(var i = 0; i < in_chrs.length; i++){ transl[in_chrs.charAt(i)] = out_chrs.charAt(i); }
        return this.replace(chars_rgx, function(match){
            return transl[match]; });
    };
    

    EDIT (by @Tomalak)

    I appreciate the idea. However, there are several things wrong with the implementation, as outlined in the comment below.

    Here is how I would implement it.

    var stripAccents = (function () {
      var in_chrs   = 'àáâãäçèéêëìíîïñòóôõöùúûüýÿÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ',
          out_chrs  = 'aaaaaceeeeiiiinooooouuuuyyAAAAACEEEEIIIINOOOOOUUUUY', 
          chars_rgx = new RegExp('[' + in_chrs + ']', 'g'),
          transl    = {}, i,
          lookup    = function (m) { return transl[m] || m; };
    
      for (i=0; i

提交回复
热议问题