私は主にjavascript、Jquery、ノックアウトなどで仕事をしています
Eval()を私に引き付けたのは
var a = 5;
var b = 10;
eval("a+b");
//Gives me output 15
注:a
およびb
の値が動的に変化する場合に作業します
私の仕事では、json、knockoutなどの多くの動的オブジェクトを扱っています。したがって、evalは私の問題のほとんどを解決します。しかし、私が読んだように、減速などのeval()には非常に多くの問題があることがわかりました。
私は多くを検索し、オブジェクトとしての方程式に文字列として取得する方程式を評価する必要があるとき、eval()の代替物を見つけていません。
上記の例を念頭に置いて、eval()の代わりにプラグインまたは関数を提案することはできますか?
問題:
ノックアウトマッピングを使用して、Jsonデータからテーブルを作成しています。 jsonの形式がテーブルであるものが生成されるように。また、計算されたノックアウトを使用していくつかのフィールドを計算します。今はハードコードされたを使用しています
self.Salary = ko.computed(function(){ return self.salaryEqn() && eval(self.salaryEqn()).toFixed(2); })
self.salaryEqn(salEqnTxt);
これらの方程式を動的に実行したい。文字列として動的に作成できますが、それらを評価することは私が直面している問題です。
解決策が欲しい
Evalを使用せずにJavaScriptの文字列に格納されている数式を計算する方法はありますか?
数式のように
"self.Salary = ko.computed(function(){ return self.salaryEqn() && eval(self.salaryEqn()).toFixed(2); })"
この点で、Javascriptは非常に柔軟な言語です。非常にveryeval()
が与えられた質問に対する正しい答えであるいくつかのケースがあり、ここでは確かに必要ありません。
a
変数とb
変数がオブジェクトの一部である場合、文字列の添え字を使用してそれらにアクセスできます。
つまり、_myobj.a
_は_myobj['a']
_としても参照できます。
それから、添え字に変数を使用できるため、myobj
の任意の要素を動的に参照できます。
_var myobj = {a : 5, b : 10};
var dynamicProperty1 = 'a';
var dynamicProperty2 = 'b';
//gives 15.
alert( myobj[dynamicProperty1] + myobj[dynamicProperty2] );
_
eval()
は不要です。 dynamicProperty
文字列は自由に作成できます。そのため、実質的に無限の柔軟性があります。
a
およびb
変数がグローバルである場合、ブラウザーのJSグローバルは実際にはwindow
オブジェクトの子であるため、グローバルでもこの手法を使用できます。
つまり、グローバル変数a
は_window.a
_または_window['a']
_からもアクセスできます。後者のオプションを使用すると、上記と同じdynamicProperty
トリックを実行できます。
それが役に立てば幸いです。
多分window['var' + num]
の方が便利かもしれません。ご質問の内容がよくわかりません。
受け取るまでわからない方程式を計算したいのですか?
その場合は、 evalを使用せずにJavaScriptで文字列値を計算する を参照してください。
evalは時々使用できますが、方程式の文字列が信頼できるソースからのものであり、動的方程式の評価のようなものが必要な場合のみです。
root = {a: 1, b: 2}
などのオブジェクトの下でそれらを収集できる場合、
Object.observe(root, function(newValues) {
res = newValues.object.a + newValues.object.b;
});
res
またはa
が変更されるたびに、b
変数を最新の状態に保つことができます
ユーザーが作成した動的方程式を実行しようとしているようです。
たとえば、「a + b + c」または「dog + cat」の場合がありますが、わかりません。
そのようなユーザー入力式を処理する最良の方法は、テキストを解析してトークンにし、トークンを値/オペランドに変換することです。
これは大変な作業ですが、事前に解決されたソリューションがあります。たとえば、 math.js