如何用数组中的值替换字符串中的字符?

时间:2013-12-09 18:10:19

标签: javascript jquery arrays

我有两个阵列。

var a = ['one', 'two', 'three'];
var b = ['two', 'three', 'four'];
var string = 'The only one and two and three';

我尝试使用for-loop。

for ( var i = 0; i < string.length; i++) {
    string = string.replace(a[0], b[0]);
    string = string.replace(a[1], b[1]);
    string = string.replace(a[2], b[2]);
}

但问题是,在第一次迭代后,替换值再次替换!我想将one替换为两个,将two替换为三个,将three替换为四个。< / p>

预期结果:The only two and three and four

我得到:The only four and four and four

6 个答案:

答案 0 :(得分:5)

一种可能的方法:

var dict = {};
a.forEach(function(el, i) {
    dict[el] = b[i];
});

var patt = a.join('|');
var res = string.replace(new RegExp(patt, 'g'), function(word) {
    return dict[word];
});
console.log(res); // The only two and three and four

Demo。实际上它非常简单:首先你创建一个字典(其中键是要替换的单词,值是,以及替换它们的单词),其次,你创建一个'交替'正则表达式(带有|符号 - 你如果有的话,我们需要引用元字符。最后,使用这个创建的模式使用单个replace来查看字符串 - 以及替换函数,该函数在字典中查找特定的“更正单词”。

答案 1 :(得分:3)

您不需要循环,只需向后替换:

var a = ['one', 'two', 'three'];
var b = ['two', 'three', 'four'];
var string = 'The only one and two and three';

string = string.replace(a[2], b[2]);
string = string.replace(a[1], b[1]);
string = string.replace(a[0], b[0]);

注意:这适用于此示例,它不是通用的。

答案 2 :(得分:3)

只需发布一种替代方法,即拆分原始字符串并将其替换为dict对象。

dict对象是在替换之前构建的,因为知道要替换的内容是必不可少的。

var a = ['one', 'two', 'three'];
var b = ['two', 'three', 'four'];
var string = 'The only one and two and three';

var dict = {};
for (var i = 0; i < a.length; i++) {
    dict[a[i]] = b[i];
}

var stringtokens = string.split(' ');
for (var i = 0; i < stringtokens.length; i++) {
    if (dict.hasOwnProperty(stringtokens[i])){
        stringtokens[i] = dict[stringtokens[i]];
    }
}

console.log(stringtokens.join(' '));

<强> Working fiddle

答案 3 :(得分:2)

向后做:

var a = ['one', 'two', 'three'];
var b = ['two', 'three', 'four'];
var string = 'The only one and two and three';

for (var i = string.length-1; i >= 0; i--) {
    string = string.replace(a[i], b[i]);
}

Working demo

答案 4 :(得分:1)

您可以反转每个数组来实现此目的。 另一种方式是常规模式。

此外,您的代码毫无意义。如果需要迭代数组,为什么要遍历字符串?

这样可行:

for ( var i = 0; i < a.length; i++) {
    string = string.replace(a[a.length - 1 - i], b[b.length - 1 - i]);
}

另外,看看这种通用方式: http://phpjs.org/functions/str_replace/

您可以这样做:

str_replace(['{name}', 'l'], ['hello', 'm'], '{name}, lars'); 

此函数可以将数组作为参数。

答案 5 :(得分:0)

反过来说吧。问题是,在将one替换为two后,您将所有two替换为three,然后使用three和{{{{}}执行相同操作1}},最后留下你所有的four。如果你颠倒了替换的顺序,那就不会发生。