15

日常業務中に、たまたま、JSON の結果をクエリするための LINQ 式のような連鎖型の JavaScript 関数を作成しました。

var Result = from(obj1).as("x").where("x.id=5").groupby("x.status").having(count("x.status") > 5).select("x.status");

それは完全に機能し、期待される結果をもたらします。

コードがこのように(より読みやすい方法で)書かれている場合、これはすばらしく見えるのではないかと思っていました

var Result = from obj1 as x where x.status
groupby x.status having count(x.status)  > 5
select x.status;

これを達成する方法はありますか??

乾杯

ラメシュ・ベル

4

8 に答える 8

20

いいえ。JavaScript はこれをサポートしていません。

しかし、これもかなり良さそうです:

var Result =  from(obj1)
             .as("x")
             .where("x.id=5")
             .groupby("x.status")
             .having(count("x.status") > 5)
             .select("x.status");
于 2009-09-01T10:06:54.467 に答える
6

ほとんどの人は、お気に入りの言語からメタプログラミングを試みることを主張します。言語がメタプログラミングを十分にサポートしていない場合、それは機能しません。他の回答では、JavaScript はそうではないことがわかりました。

これを回避する方法は、プログラム変換ツールを使用して、言語の 外部からメタプログラミングを行うことです。このようなツールは、ソース コードを解析し、それに任意の変換を実行して (これはメタプログラミングが行うことです)、修正されたプログラムを吐き出すことができます。

任意の言語を解析できる汎用プログラム変換システムがある場合は、好きな言語でメタプログラミングを行うことができます。このようなツールについては、 DMS Software Reengineering Toolkitを参照してください。このツールには、C、C++、Java、C#、COBOL、PHP、ECMAScript、およびその他の多くのプログラミング言語用の堅牢なフロント エンドがあり、これらすべてのメタプログラミングに使用されています。

あなたのケースでは、SQL クエリの新しい構文で JavaScript 文法を拡張し、それらをプレーンな JavaScript に変換したいと考えています。(これは、意図的なプログラミングによく似ています) DMS を使用すると、ルールを追加して JavaScript 方言を簡単に構築できます。その後、そのプログラム変換機能を使用して、同等の標準 Javascript を生成できます。

そうは言っても、私は意図的なプログラミングが私見をリードする「地球上のすべてのプログラマーのカスタム構文」の大ファンではありません。

これが価値があると考える大規模なユーザー コミュニティがある場合、これは良いことです。このアイデアは、その 1 つかもしれないし、そうでないかもしれません。問題の 1 つは、実験を行わないとわからないことであり、十分な社会的牽引力を得ることができない可能性があります。

于 2010-02-26T18:16:01.477 に答える
5

あなたが望んでいたものではありませんが、JavaScript でパーサーを記述し、(文字列として格納された) クエリを解析して実行することができます。たとえば、http://jscc.jmksf.com/のようなライブラリを使用すると(他にもあることは間違いありません)、実装が難しくありません。

しかし、質問にあるものはすでに見栄えがよく、提案した方法で表示したい理由がわかりません。

于 2009-09-01T10:44:02.647 に答える
3

さて、あなたのコードサンプルでは:

var Result = from(obj1)
            .as("x")
            .where("x.id=5")
            .groupby("x.status")
            .having(count("x.status") > 5)
            .select("x.status");

私が目にする唯一の問題 (識別子として使用される以外select) は、関数の引数として述語を埋め込むことです。代わりに関数にする必要があります。

            .having(function(x){ return x.status > 5; })

JavaScript にはクロージャーと動的型付けがあるため、非常に気の利いたエレガントな処理を行うことができます。お知らせするだけです。

于 2010-07-20T02:09:04.127 に答える
1

必要なのは、javascript パーサーを SQL パーサーに変更することです。それを行うために作成されたわけではありません.javascript構文では許可されていません.

あなたが持っているものは、SQL と 90% 似ており (SQL に直接マップされます)、100% 有効な JavaScript です。これは素晴らしい成果です。タイトルの質問に対する私の答えは次のとおりです。はい、メタプログラミングは可能ですが、いいえ、JavaScript 文法を使用する必要があるため、SQL パーサーは提供されません。

于 2009-09-01T10:57:56.830 に答える
0

JSON データがある場合は、 JSONPathのようなものが必要になるかもしれません。これはhttp://www.json.org/で見つけました。必要なものではない場合、そこからリンクされている他の多くのツール。

(これにも取り組んでいます: http://docs.dojocampus.org/dojox/json/query )

于 2009-09-01T10:37:54.170 に答える