用两个数组中的值替换字符串

时间:2014-01-27 23:46:18

标签: javascript jquery

我有一个字符串例如:

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);

6 个答案:

答案 0 :(得分:4)

for(var x = 0 ; x < array1.length; x++)
    string = string.replace(new RegExp(array1[x], "g"), array2[x])

FIDDLE

答案 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)]
});

演示:http://jsfiddle.net/Guffa/2Uc92/

答案 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"

http://jsfiddle.net/2twr2/

答案 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

我很想听听关于阵列地图与其他方法的表现的想法。

相关问题