How Do You Map-replace Characters In Javascript Similar To The 'tr' Function In Perl?
I've been trying to figure out how to map a set of characters in a string to another set similar to the tr function in Perl. I found this site that shows equivalent functions in J
Solution 1:
There isn't a built-in equivalent, but you can get close to one with replace
:
data = data.replace(/[\-_]/g, function (m) {
return {
'-': '+',
'_': '/'
}[m];
});
Solution 2:
Method:
String.prototype.mapReplace = function(map) {
var regex = [];
for(var key in map)
regex.push(key.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"));
returnthis.replace(newRegExp(regex.join('|'),"g"),function(word){
return map[word];
});
};
A perfect example:
var s = "I think Peak rocks!"
s.mapReplace({"I think":"Actually","rocks":"sucks"})
// console: "Actually Peak sucks!"
Solution 3:
I can't vouch for 'efficient' but this uses a regex and a callback to provide the replacement character.
functiontr( text, search, replace ) {
// Make the search string a regex.var regex = RegExp( '[' + search + ']', 'g' );
var t = text.replace( regex,
function( chr ) {
// Get the position of the found character in the search string.var ind = search.indexOf( chr );
// Get the corresponding character from the replace string.var r = replace.charAt( ind );
return r;
} );
return t;
}
For long strings of search and replacement characters, it might be worth putting them in a hash and have the function return from that. ie, tr/abcd/QRST/ becomes the hash { a: Q, b: R, c: S, d: T } and the callback returns hash[ chr ].
Solution 4:
This functions, which are similar how it's built in Perl.
functions(a, b){ $_ = $_.replace(a, b); }
functiontr(a, b){ [...a].map((c, i) =>s(newRegExp(c, "g"), b[i])); }
$_ = "Εμπεδοκλης ο Ακραγαντινος";
tr("ΑΒΓΔΕΖΗΘΙΚΛΜΝΟΠΡΣΤΥΦΧΩ", "ABGDEZITIKLMNOPRSTIFHO");
tr("αβγδεζηθικλμνοπρστυφχω", "abgdezitiklmnoprstifho");
s(/Ξ/g, "X"); s(/Ψ/g, "Ps");
s(/ξ/g, "x"); s(/ψ/g, "Ps");
s(/ς/g, "s");
console.log($_);
Solution 5:
This will map all a
s to b
and all y
to z
var map = { a: 'b', y: 'z' };
var str = 'ayayay';
for (var i = 0; i < str.length; i++)
str[i] = map[str[i]] || str[i];
EDIT:
Apparently you can't do that with strings. Here's an alternative:
var map = { a: 'b', y: 'z' };
var str = 'ayayay', str2 = [];
for (var i = 0; i < str.length; i++)
str2.push( map[str[i]] || str[i] );
str2.join('');
Post a Comment for "How Do You Map-replace Characters In Javascript Similar To The 'tr' Function In Perl?"