2016-09-30 112 views
2

作爲一種做法,我試圖創建一個假的「翻譯」,將英語轉換爲使用.replace英文字母的混亂版本,但是我有一個問題,即替換操作替換之前替換的字母。防止替換已替換的字母

有沒有辦法讓我防止代碼重新替換已被替換的字母?

我的HTML:

<button onclick="Function()">click</button> 

<p id="let">a b c d e f g h i j k l m n o p q r s t u v w x y z</p> 

<p id="demor"></p> 

我的javascript:

function Function() { 
    var str = document.getElementById("let").innerHTML; 
    var txt = str.replace(/a/g,"x").replace(/b/g,"b").replace(/c/g,"c").replace(/d/g,"d").replace(/e/g,"a").replace(/f/g,"k").replace(/g/g,"s").replace(/h/g,"r").replace(/i/g,"e").replace(/j/g,"i").replace(/k/g,"d").replace(/l/g,"r").replace(/m/g,"z").replace(/n/g,"m").replace(/o/g,"s").replace(/p/g,"v").replace(/q/g,"p").replace(/r/g,"r").replace(/s/g,"k").replace(/t/g,"s").replace(/u/g,"i").replace(/v/g,"q").replace(/w/g,"v").replace(/x/g,"x").replace(/y/g,"e").replace(/z/g,"b"); 
    document.getElementById("demor").innerHTML = txt; 
} 

任何幫助將不勝感激!

+0

創建一個對象,並使用一個鍵值對,以確定應該是什麼什麼,而不是做'.replace'這麼多次:■ –

+0

這裏是「喬納斯W公司的代碼的演繹下方施加用一些方便的'pseduo loc'字母替換:https://jsfiddle.net/7snz7n4f/ –

回答

0

這是令人難以置信的效率低下,而且應該傳達出一般的想法 - 基本上你分割字符串所以它是一個字符數組,然後運行上的每個字符替換:

var map = { a: 'x', b: 'b', c: 'c', d: 'd', e: 'a', f: 'k', g: 's', h: 'r', i: 'e', j: 'i', k: 'd', l: 'r', m: 'z', n: 'm', o: 's', p: 'v', q: 'p', r: 'r', s: 'k', t: 's', u: 'i', v: 'q', w: 'v', x: 'x', y: 'e', z: 'b' }; 

function Function() { 
    var str = "a b c d e f g h i j k l m n o p q r s t u v w x y z"; 
    var txt = str.split('').map(function(c) { 
     return map[c]; 
    }).join(''); 
    console.log(txt); 
} 
+0

這並不能解決問題。用戶不希望被替換的字母再次被替換:a-> x-> b - > e或者那樣 –

+0

@Jonasw這確實解決了這個問題。除非你誤解了這個問題?例如,他想改變f - > k,然後當它到達k(最初是f)時,他不希望它再次改變,因爲它已被替換。每個角色只能更換一次。這解決了這個問題。 – dave

+0

但是你的代碼不能用str來替換g中的g,用這個結果替換b中的g ...因此實際上也是這樣做的? –

0

我會去不同的方式 - 創建一個數字,這將是信件的重新排序。

結構示例:

var nums={ 
    1:"a", 
    2:"b", 
    3:"c", 
    4:"d" 
...//rest 
} 

下一頁改變原單文本數字:

str.replace(/a/g,"1").replace(/b/g,"2") ... 

最後是做第二更換,但到最後的字母

str.replace(/1/g,nums[1]).replace(/2/g,nums[2]) ... 

所以我們肯定這一變化將不會被過分重視。我的js代碼在答案中是僞代碼,我只想顯示這個想法。最重要的是數字應該像識別符一樣,因此必須是唯一的。

0

您的解決方案將爲每次替換掃描整個字符串一次。更好地發揮字符焦點,依次對每個字符進行翻譯。

這是一個快速和骯髒的版本,削減到只包括小寫字母 - 你可以整理一下,使它覆蓋任何你喜歡的字符範圍:

var input = "helloworld"; 
var xlate = "bcdefghijklmnopqrstuvwxyza"; 
var asciiA = 'a'.charCodeAt(); 

var out = ""; 
for(i=0;i<input.length;i++) { 
    out = out + xlate[input[i].charCodeAt() - asciiA]; 
} 

alert(out); 
0

好吧,我認爲不能被用做替代,這就是我怎麼會做到這一點:

//create translation arrays 
var letters=["a","b",...]; 
var replacewith=["x","b",...]; 

//move the string to an array 
var string="abc"; 
var arr=string.split(""); 
for(i=0;i<arr.length;i++){ 
for(o=0;o<letters.length;o++){ 
if(arr[i]==letters[o]){ 
//replace 
arr[i]=replacewith[o]; 
//stop replacing 
break; 
} 
} 
} 
string=arr.join(""); 

字符串替換字符...

0

隨着我replace-once包,你可以做次E採用:

const replaceOnce = require('replace-once') 

var str = 'a b c d e f g h i j k l m n o p q r s t u v w x y z' 
var find = 'abcdefghijklmnopqrstuvwxyz' 
var replace = 'xbcdaksreidrzmsvprksiqvxeb' 
replaceOnce(str, find.split(''), replace.split(''), 'gi') 
//=> 'x b c d a k s r e i d r z m s v p r k s i q v x e b'