1

ユーザーが(理想的には)一連のJSONオブジェクトを使用して地理データのスタイルを定義できるノードアプリを構築しています:

{
    "style":
        {
            "test": "year",
            "condition": "<= 1954 AND >= 1936",
            "color": "red"
        }
}

上記の場合、私はそのスタイルを次のように評価するのが好きです

if (year <= 1954 && year >= 1936){
    object.color = red;
}

そのような式を解析+評価する/そのようなオブジェクトからそれらを構築する簡単な方法はありますか? <=、>=、||、&& などを使用して構築された複雑な式を人々がつなぎ合わせられるようにすることに特に関心があります。

可能であれば、eval() の使用は避けたいと思います。

4

2 に答える 2

5

eval を使用したくない場合は、独自の小さなパーサーを作成し、次のような定義言語を作成する必要があります。

"condition": ["and", ["<=", 1954], [">=", 1936]],

これは、検討できる部分的な実装です。

function do_and(args, value)
{
  for (var i = 0; i < args.length; ++i) {
    if (!evaluate(args[i], value)) {
      return false;
    }
  }
  return true;
}

function evaluate(condition, value)
{
  switch (condition[0]) {
    case "and":
      return do_and(condition.slice(1), value);

    case "<=":
      return value <= condition[1];

    case ">=":
      return value >= condition[1];
  }
}

これはあなたがそれを使用する方法です:

var style = {
    "test": "year",
    "condition": ["and", ["<=", 1954], [">=", 1936]],
    "color": "red"
}, context = {
  "year": 1940
};    

if (evaluate(style.condition, context[style.test])) {
  console.log(style.color); // "red"
}

デモ

于 2013-07-04T04:05:19.330 に答える
1

何かのようなもの

var obj = JSON.parse(str);
switch (obj.style.operator){
    case '=':
    if (window[obj.style.condition] === obj.style){//assuming that the conditions are global
        object.color = obj.style;
    }
    break;
    ...
}
于 2013-07-04T03:36:06.117 に答える