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 replacement in a string.

Here is what I mean (note that this applies to German text, other languages sort differently):

```

native sorting gets it wrong: a b c o u z ä ö ü
collation-correct would be:   a ä b c o ö u ü z

```

Basically, I need all occurrences of "ä" of a given string replaced with "a" (and so on). This way the result of native sorting would be very close to what a user would expect (or what a database would return).

Other languages have facilities to do just that: [Python supplies `str.translate()`](http://docs.python.org/3.1/library/stdtypes.html#str.translate), in [Perl there is `tr/…/…/`](http://perldoc.perl.org/functions/tr.html), [XPath has a function `translate()`](http://www.w3.org/TR/xpath/#function-translate), [ColdFusion has `ReplaceList()`](http://livedocs.adobe.com/coldfusion/8/functions_m-r_33.html). But what about JavaScript?

Here is what I have right now.

```
// s would be a rather short string (something like 
// 200 characters at max, most of the time much less)
function makeSortString(s) {
  var translate = {
    "ä": "a", "ö": "o", "ü": "u",
    "Ä": "A", "Ö": "O", "Ü": "U"   // probably more to come
  };
  var translate_re = /[öäüÖÄÜ]/g;
  return ( s.replace(translate_re, function(match) { 
    return translate[match]; 
  }) );
}

```

For starters, I don't like the fact that the regex is rebuilt every time I call the function. I guess a closure can help in this regard, but I don't seem to get the hang of it for some reason.

Can someone think of something more efficient?

---

Answers below fall in two categories:
-------------------------------------

1. String replacement functions of varying degrees of completeness and efficiency (what I was originally asking about)
2. A [late mention](https://stackoverflow.com/a/42163018/18771) of [`String#localeCompare`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare), which is now [widely supported](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare#Browser_compatibility) among JS engines (not so much at the time of the question) and could solve this category of problem much more elegantly.