2012-04-06 85 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>