2017-03-19 18 views
1

を見上げる私は次のようにデータベースから計算列を持っている:文字列から要素の配列を取得し、値

var calc = "{a}+{b}==2" 

と私は私が検索できるように、「{}」を持つすべての要素を引きたいですその値をデータベースから取得します。 が最も速いのやり方であるので、私は検索可能な順序付けられた配列で終わり、文字列の値を元に戻します。

私が考えられてきました:

- For loop, looking for { then finding the next } 
- Split with a map 
- IndexOf 
+1

正しく理解していれば交換してください。正規表現を使用してこれらの変数をそれぞれ見つけ、値に置き換えます。 – Whothehellisthat

+1

regexの使い方はどうですか? –

+0

ありがとう、私は多くのオプションがあることを知っています。私は最も効率的な/最速の例を望んでいた – Wayneio

答えて

1

正規表現

var exp = /{([^}]+)}/g ,index; 
    while(index = exp.exec("{a}+{b}==2")) { 
    console.log(index[1]); 
    } 

を使用します。 Demo

1

「最も速い」方法であるかどうかは不明ですが、正規表現の使用を検討する必要があります。以下のような

何か:

var calc = "{a}+{b}==2"; 
var re = /{([^}]+)}/g; 
var res; 
var result = []; 
while (res = re.exec(calc)) 
{ 
    result.push(res[1]); 
} 
console.log(result); 

あなたの正規表現は(許可された文字に基づいて、引用など){}式の実際の定義に基づいて洗練される必要があるかもしれません。

値を受け取ったら、replaceを使用して値を置き換えることができます。

var values = {a: 1, b: 3}; 
var replaced = calc.replace(re,function(match,name) { return values[name]; }); 
console.log(replaced); 

NB:あなたはevalなどにこれを送信する場合非常に注意してください。

+0

私はそれらをevalに送る計画をしています - あなたが慎重だと言う時を明確にすることはできますか? – Wayneio

+0

あなたが評価しようとしている文字列の内容が100%確実でない場合は、 'eval'を使用しないでください。 'eval'はあなたが投げるものを実行することを覚えておいてください。それはXSS、CSRFのために使うことができます... "eval dangerous"を検索してください。 – jcaron

0

最初にRegexが頭に浮かんでいますが、O(n)時間にこのジョブを実装する別の方法があります。

function getDatas(s){ 
 
    var dataOn = false; 
 
    return Array.prototype.reduce.call(s,(d,c) => dataOn ? c !== "}" ? (d[d.length-1] += c,d) 
 
                    : (dataOn = false, d) 
 
                 : c === "{" ? (dataOn = true, d.push(""),d) 
 
                    : d, []); 
 
    
 
} 
 

 
var calc = "{a}+{b}+{colorSpace}==2", 
 
    result = getDatas(calc); 
 
console.log(result);

ので、好奇心から、私はJSBen上でいくつかのテストを行っているし、@ jcaronの正規表現は確かに非常に効率的であると思われます。 indexOfまたはforループのような他のアイデアを使ってテストを拡張することができます。

関連する問題