我有一个字符串例如:
var string = 'This is a text that needs to change';
然后我有两个阵列。
var array1 = new Array('a', 'e', 'i', 'o', 'u');
var array2 = new Array('1', '2', '3', '4', '5');
现在,我要做的是用array1检查字符串并用数组2中的相应值替换字符串。所以使用函数来执行此操作我需要得到类似的内容:
string = 'Th3s 3s 1 t2xt th1t n22ds to ch1ng2';
有关如何解决此问题的任何想法?并且可能是一种有效的方法?因为我计划在巨大的数据块上使用它。
修改
根据这里的答案,我编写了一个代码,允许上述操作,同时也允许几个特殊字符。看看吧。
var string = 'This is a text that needs to change';
var array1 = new Array('ee', 'a', 'e', 'i', 'o', ']');
var array2 = new Array('!', '1', '2', '3', '4', '5');
function escapeString(str){
return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
}
var re = new RegExp('(' + escapeString(array1.join('ૐ')) + ')', 'g');
var nx = new RegExp(re.source.replace(/ૐ/g, "|"), 'g');
alert(nx);
var lookup = {};
for (var i = 0; i < array1.length; i++) {
lookup[array1[i]] = array2[i];
}
string = string.replace(nx, function(c){
return lookup[c]
});
alert(string);
答案 0 :(得分:4)
for(var x = 0 ; x < array1.length; x++)
string = string.replace(new RegExp(array1[x], "g"), array2[x])
答案 1 :(得分:3)
如果要替换的字符只是普通字母,而且正则表达式中没有任何特殊含义,那么您可以创建一个仅匹配这些字符的正则表达式。这允许您使用翻译这些字符的函数使用单个替换:
var string = 'This is a text that needs to change';
var array1 = new Array('a', 'e', 'i', 'o', 'u');
var array2 = new Array('1', '2', '3', '4', '5');
var str1 = array1.join('');
var re = new RegExp('[' + str1 + ']', 'g');
string = string.replace(re, function(c){
return array2[str1.indexOf(c)]
});
答案 2 :(得分:2)
这会设置1 RegExp
并仅调用replace
一次。
var string = 'This is a text that needs to change';
var array1 = new Array('a', 'e', 'i', 'o', 'u');
var array2 = new Array('1', '2', '3', '4', '5');
var regex = new RegExp( '['+array1.join('')+']', 'g' );
var lookup = {}; // Setup a hash lookup
for( var i=0 ; i<array1.length ; ++i )
lookup[array1[i]] = array2[i];
string.replace(regex, function(c) { return lookup[c]; });
// "Th3s 3s 1 t2xt th1t n22ds t4 ch1ng2"
答案 3 :(得分:1)
以下是一个例子:
var string = 'This is a text that needs to change';
var vowels = ['a','e','i','o','u'];
var numbers = [1,2,3,4,5];
var result = string.replace(/./g, function(char) {
var idx = vowels.indexOf(char);
return idx > -1 ? numbers[idx] : char;
});
//^ Th3s 3s 1 t2xt th1t n22ds t4 ch1ng2
答案 4 :(得分:0)
假设您的两个阵列具有相同的大小:
for(var i = 0; i < array1.length; i++){
mystr = mystr.replace(array1[i], array2[i]);
}
答案 5 :(得分:0)
为了探索做同样事情的其他有趣方法,这里有一个使用数组映射的实现。
这只是另一种很酷的方式,不使用循环,替换或正则表达式。
var string = 'This is a text that needs to change';
var array1 = ['a', 'e', 'i', 'o', 'u'];
var array2 = ['1', '2', '3', '4', '5'];
var a = string.split('');
a.map(function(c) {
if (array1.indexOf(c) != -1) {
a[ a.indexOf(c) ] = array2[ array1.indexOf(c) ];
}
});
var newString = a.join('');
alert( newString );
//Outputs "Th3s 3s 1 t2xt th1t n22ds t4 ch1ng2"
演示:JSFiddle
关于数组方法的有趣博客文章 - map and reduce。
我很想听听关于阵列地图与其他方法的表现的想法。