2017-03-19 10 views
1

값을 조회 데이터베이스에서 그들의 값. 가장 빠른 방법입니다. 따라서 배열을 조회하여 문자열에서 값을 다시 바꿀 수 있습니다.문자열에서 요소의 배열을 가져 오기와 같은 데이터베이스에서 내가 계산 문자열이

은 내가 생각했습니다

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

제대로 이해했다면 교체해야합니다. regex를 사용하여 각 변수를 찾고 값으로 바꿉니다. – Whothehellisthat

+1

정규식을 사용하는 것은 어떻습니까? –

+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'은 당신이 던지는 모든 것을 실행할 것임을 기억하십시오. XSS, CSRF ... "eval dangerous"로 검색 할 수 있습니다. – jcaron

0

정규식은 마음에 먼저 오지만 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 루프와 같은 다른 아이디어로 테스트를 연장 할 수 있습니다.