2017-10-12 1 views
-4

예를 들어 다음과 같은 문자열이 있습니다. "10 + 10-5x2" 변환 할 내용 : 10의 결과입니다. 위의 방정식. 귀하의 의견은 * 대신에 x을 처리 할 필요가있는 경우 사항은 다음과 같이 일하는 것이jQuery를 사용하여 문자열을 숫자로 변환해야합니다.

+2

전체 문제를 해결하도록 다른 사람들에게 요청하는 대신 문제 해결 방법에 대한 혼란에 관한 질문을하십시오. – Taplar

+0

괜찮습니다. 나는 for 루프를 사용하는 대신 그것을 해결하는보다 효율적인 방법을 찾고 있었다. –

답변

1

을 시도하지만,이 방법 평가 작품에 질문의 많은 것 같아 그래서 나는 그것을 설명한다. (또한 eval을 사용하는 것은 매우 나쁜 습관입니다.)

먼저 연산 순서에 따라 표현식 트리를 만들어야합니다.

eq_to_eval = "10+10-5*2" 

operations = [ 
    { 
    operation: '-', 
    func: (a, b) => a - b 
    }, 
    { 
    operation: '+', 
    func: (a, b) => a + b 
    }, 
    { 
    operation: 'x', 
    func: (a, b) => a * b 
    }, 
    { 
    operation: '/', 
    func: (a, b) => a/b 
    } 
] 

function generateExpressionTree(eq) { 
    for (let op of operations) { 
    let op_index = eq.indexOf(op.operation) 
    if(op_index > -1) { 
     let left = eq.substring(0, op_index) 
     let right = eq.substring(op_index + 1) 
     return [generateExpressionTree(left), op, generateExpressionTree(right)] 
    } 
    } 
    return Number(eq) // if there are no operations, its just a number 
} 

이것은 기본적 방정식을 얻어 PEMDAS에 제 1 동작의 첫 번째 인스턴스를 발견하고 [left, operation, right] 형태의 트리를 만든다. 트리의 가장 높은 항목을 먼저 평가해야하기 때문에 작업 순서가 실제로 뒤집 힙니다. 그들은 조작이 없을 때까지 왼쪽과 오른쪽 부분을 재귀 적으로 평가합니다.

이제 실제로 이것을 계산하여 숫자로 변환해야합니다.

function evaluateExpressionTree(tree) { 
    if (typeof tree == 'number') { 
    return tree 
    } 
    return tree[1].func(evaluateExpressionTree(tree[0]), evaluateExpressionTree(tree[2])) 
} 

이 트리의 각 항목으로 이동하고 좌측, 우측을 평가하고 연산자를 적용하여 이들 각각을 평가한다.

tr = generateExpressionTree(eq_to_eval) 
console.log(evaluateExpressionTree(tr)) 
# 10 

코드 : https://repl.it/M88F

편집 :

마지막으로, 우리는 함께 코드를 테스트 할 수 있습니다 그들은 내가 생각하는 jQuery를에 대한 질문 제목을 편집했다.

+0

meyer9 설명에 감사드립니다. for 루프를 사용하여 문제를 해결하기 위해 노력하고 있었고 코드가 정말 심해지고있었습니다. 매우 감사! –

0

jQuery.globalEval('var z=10+10-5*2');

감사 :

jQuery.globalEval('var z=10+10-5x2'.replace(/x/g,'*'));

결과 중 하나의는 z

-2

당신에 그냥 사용할 수 있습니다 '

,

var string = "10+10-5*2"; 
 
var ans = eval(string);

평가 '

+0

'x'는 문자입니다. '*'는 곱해진다. – PHPglue

-2

이 :)

const str = '10+10-5x2'; 
console.log(eval(str.replace(/x/,'*'))); 
내가 평가 후면을 사용하여 답변의 톤을 볼
+1

글로벌 대체품이 필요합니다. – PHPglue

관련 문제