2010-01-14 129 views
6

全局替換,您可以使用陣列進行更換:JavaScript和陣列

var array = {"from1":"to1", "from2":"to2"} 

for (var val in array) 
    text = text.replace(array, array[val]); 

但是如果你需要在全球範圍內更換什麼,即 文本= text.replace(/自/克,「來」);

數組是相當大的,所以,如果我寫的「文本= text.replace(...)」爲每一個變量腳本會佔用大量的空間。

如何在這種情況下使用數組? 「/ from1/g」:「to1」不起作用。

+2

你的數組實際上是一個Object對象,而不是一個數組對象,即使它可以被看作是一個關聯數組:) – Luc125 2011-11-27 12:43:02

回答

7
var array = {"from1":"to1", "from2":"to2"} 

for (var val in array) 
    text = text.replace(new RegExp(val, "g"), array[val]); 

編輯:正如Andy所說,您可能必須使用this one這樣的腳本來跳過特殊字符。

+0

如果字符串可以包含正則表達式的特殊字符,不要忘記正確轉義。 – 2010-01-14 12:43:46

2

這裏有一個簡單的,非基於正則表達式串成語替換JS,所以你不必擔心正則表達式,特殊字符:

for (var val in array) 
    text= text.split(val).join(array[val]); 

注有與使用對象的問題通用查找。如果有人用對象原型(壞主意,但有些圖書館做了這樣做),你可以得到比想要更多的val;您可以使用hasOwnProperty測試來避免這種情況。另外在IE中,如果你的字符串碰巧與ObjecttoString等方法衝突,IE會神祕地隱藏它。

對於這裏的例子,你可以,但是作爲字符串可以是任何東西的一般情況,你需要解決它,要麼通過處理鍵字符串來避免衝突,要麼通過使用不同的數據結構如陣列[find, replace]陣列。

4

這裏是我的解決方案,假設array的字符串鍵不需要進行轉義。

這是特別有效的,當對象array很大:

var re = new RegExp(Object.keys(array).join("|"), "g"); 
var replacer = function (val) { return array[val]; }; 
text = text.replace(re, replacer); 

注意這需要Object.keys方法是可用的,但你可以很容易地勻場,如果事實並非如此。