2017-10-12 4 views
-4

私は次の文字列を持っています: "10 + 10-5x2" これを変換する必要があります: 10上記の方程式。あなたの入力は*の代わりにxを処理する必要がある場合 は、このような何かがうまくいく文字列をjQueryを使用して適切な問題で計算する数値に変換する必要があります

+2

問題を解決する方法について、他の人にあなたの問題全体を尋ねるのではなく、混乱に関する質問をしてください。 – Taplar

+0

大変申し訳ありません。 forループを使用する代わりに、より効率的に解決する方法を探していました。 –

答えて

1

を、私はevalのを使用して回答のトンを見るが、これはどのようにevalの作品に質問の多くのように思えます私はそれを説明する。 (また、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における最初の操作の最初のインスタンスを見つけ、次いで[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

EDIT:

最後に、我々がコードをテストすることができます彼らは、私が思うの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);

evalの」

+0

'x'は文字です。 '*'は掛け算されます。 – PHPglue

-2

はこれを試してみてください:)

const str = '10+10-5x2'; 
console.log(eval(str.replace(/x/,'*'))); 
+1

グローバルな交換が必要です。 – PHPglue

関連する問題