2016-09-30 21 views
2

練習として、私は.replaceを使って英語を混乱させるバージョンの英語に変換する偽の翻訳者を作成しようとしていますが、 .replaceアクションは、以前に置き換えられた文字を置き換えます。.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

ここでは、以下の適用ジョナスのワットのコード」の演出でありますいくつか便利な「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またはsthのように –

+0

@Jonaswこれは問題を解決します。あなたが問題を誤解しない限り?彼はf - > kを変えたいと思っています。そして、それがkになると(元はfだった)、すでに置き換えられているので、再び変更したくはありません。各キャラクターは1回だけ交換する必要があります。これはそれを解決します。 – dave

+0

しかし、あなたのコードはstrのgをxに置き換えず、bのgをその結果に置き換えます...そして実際には同じことをしていますか? –

0

は、私は別の方法で行くだろう - 手紙のrepresantationされる数字を作成します。

例の構造:番号へ

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

次の変更orginalテキスト:

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

最終置き換える第二が、最終的な手紙に

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

を行うにはだから我々は確信していますされますその変更は上書きされません。答えの私のjsコードは疑似コードです、私はそのアイデアを示したかっただけです。最も重要なのは、数字は識別記号のようなものでなければならないので、ユニークでなければならないということです。

0

ソリューションは、置換えごとに文字列全体をスキャンします。 charでcharを実行し、それぞれを順番に実行する方がはるかに優れています。

これは間に合わせおよびバージョンのみ小文字をカバーするために削減される - あなたはそれを整理し、それはあなたが好きな文字の範囲カバーすることができます:、私

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

[OK]をそれは置き換えで行うことがカントと思いますが、私はそれを行うだろうかthatsの:

//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(""); 

文字列を文字に置き換えられます...私のreplace-onceパッケージに

0

を、あなたが目を行うことができます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' 
関連する問題