2012-04-06 42 views
3

如何在JavaScript中替换值替换为数组。根据搜索/替换对替换字符串中的许多值

我想完成将数字(例如)替换在一起。怎么样?

1 -replace whit->11
2 -replace whit->22

DEMO:http://jsfiddle.net/ygxfy/

<script type="text/javascript"> 
    var array = {"1":"11", "2":"22"} 
    var str="13332"; 
    document.write(str.replace(array)); 
</script>​ 
+0

但是没有数组...... – xdazz 2012-04-06 14:51:02

+1

这不是一个数组,它是一个名为“数组”的引用对象的变量。还要注意,它只是不适合使用'document.write()'。 – Phrogz 2012-04-06 14:51:46

回答

5

你必须创建一个模式,使用正则表达式,然后将其传递给.replace方法。

var array = {"1":"11", "2":"22"}; // <-- Not an array btw. 
// Output. Example: "1133322" 
document.write(special_replace("13332", array)); 

function special_replace(string_input, obj_replace_dictionary) { 
    // Construct a RegEx from the dictionary 
    var pattern = []; 
    for (var name in obj_replace_dictionary) { 
     if (obj_replace_dictionary.hasOwnProperty(name)) { 
      // Escape characters 
      pattern.push(name.replace(/([[^$.|?*+(){}\\])/g, '\\$1')); 
     } 
    } 

    // Concatenate keys, and create a Regular expression: 
    pattern = new RegExp(pattern.join('|'), 'g'); 

    // Call String.replace with a regex, and function argument. 
    return string_input.replace(pattern, function(match) { 
     return obj_replace_dictionary[match]; 
    }); 
} 
+0

顺便说一句,这里的演示:http://jsfiddle.net/ygxfy/11/ – 2012-04-06 14:59:55

+0

非常好。如果你(或OP)把它作为一个可重用函数包装起来,它可能会更好。 – Phrogz 2012-04-06 15:01:18

+0

@Progro我把这个东西转换成了可重用的函数。也省略了'Object.keys',因为我不得不循环键。 – 2012-04-06 15:09:55

0
<script type="text/javascript"> 
    var rep = {"1":"11", "2":"22"} 
    var str="13332"; 

    for (key in rep) { 
     str = str.split(key).join(rep[key]); 
    } 

    document.write(str); 
</script>​ 
+1

秋千和一个小姐。 – AlienWebguy 2012-04-06 14:52:01

+0

@spacevillain你试过这个吗? – 2012-04-06 14:53:14

+1

我做了,我不明白它有什么问题。 1被11替换,2被22替换,导致1133322 – spacevillain 2012-04-06 14:55:40

3

http://jsfiddle.net/mendesjuan/uHUs9/

你可以传递函数为replace方法

RegExp.escape = function(text) { 
    return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); 
} 

String.prototype.mapReplace = function (replacements) { 
    var regex = []; 

    for (var prop in replacements) { 
     regex.push(RegExp.escape(prop)); 
    } 

    regex = new RegExp(regex.join('|'), "g"); 

    return this.replace(regex, function(match){ 
     return map[match]; 
    }); 
} 


var map = {"1":"11", "2":"22"};  
var str="13332"; 

document.write(str.mapReplace(map));​ 
+0

这是一个很好的js正则表达式引擎。我可能会尝试使用esajilla作为更简单的实现。 – javadba 2016-02-12 21:27:56

+0

函数中的小错误String.prototype.mapReplace:map未定义。应该使用替代地图(或重命名为地图)。 – syme 2017-02-05 14:36:58

1
var str = "13332", 
    map = {"1":"11", "2":"22"}; 

str.split("").map(function(num){ 
    return map.hasOwnProperty(num) ? map[num] : num; 
}).join(""); 

//"1133322" 
+0

@JuanMendes''23333“'是使用该地图的结果,是不是预期的结果?此外,使用带有“123”的地图会产生“233”,所以请在遮挡它之前尝试编码; P – Esailija 2012-04-06 15:13:09

+0

如何使这种工作适用于可变长度的待替换模式? – javadba 2016-02-12 21:30:21

0

怎么样使用reduce功能?

<script type="text/javascript"> 
    var array = {"1":"11", "2":"22"}; 
    var str = "13332"; 

    str = Object.keys(array).reduce(function(result, key) { 
    return result.replace(new RegExp(key, 'g'), array[key]); 
    }, str); 

    document.write(str); 
</script>