小さなjs-library Jsqryをご紹介します。
その目的を説明する最も簡単な方法は次のとおりです。
宛先:
var name; for (var i = 0; i < users.length; i++) { if (users[i].id == 123) { name = users[i].name; break; } }
後:
var name = one(users, '[_.id==?].name', 123);
このライブラリを使用すると、ループ(ネストされている場合もある)を記述する代わりに、単純なクエリ言語を使用して、オブジェクト/配列から情報を1行で抽出できます。
実際、次の2つの関数のみを実装しています。
- クエリ -結果のリストを返し、
- one-最初に見つかった結果を返します。
機能のリストは次のとおりです。
- フィルタリング
- 変換
- Pythonスタイルのインデックス/スライス
ライブラリは、現在流行している単一ページのアプリケーションアプローチに基づいて構築された1つのプロジェクトに自発的に登場しました。 1つの大きなJSONをロードし、その一部を使用して、クライアント上のサイトのさまざまな表現をレンダリングします。 そして今、これらのまさにその部分を引き裂くために、私はより便利な方法を望んでいました。 しかし、その後、ライブラリは他のケースで需要がありました。
機能について少し説明します。 一般的な場合の要求は、次の形式を取ることがあります
field1.field2[ condition or index or slice ].field3{ transformation }.field4
ここに:
- field1.field2.field3 ...- jsのように、オブジェクトのフィールドへの定期的なアクセス
- [条件] -フィルタリング
- [インデックス] - インデックスによるアクセス、jsと同じ
- [from:to:step] -Pythonスタイルのスライス
- {transformation} -オブジェクトの変換
条件と変換は 、 熟考する価値があります。
実際、すべてが非常に簡単です。 角カッコ内の各式は、実行されると、この原則に従って関数に置き換えられることを理解するだけで十分です。
condition_or_transformation⟶function (_、i){return condition_or_transformation }
(ここで_は送信された要素の値、 iはそのインデックスです)。
例:
query([1,2,3,4,5],'[_>2]{_+10}')
リクエストのパラメーター化もサポートされています。
query([1,2,3,4,5],'[_>?]{_+?}', 2, 10)
これらの機能を組み合わせることにより、非常に複雑で柔軟なクエリを作成できます。 その他の使用例については、こちらをご覧ください 。
興味深い実装から-ASTクエリツリーがキャッシュされるため、ライブラリの速度が向上します。
もちろん、私のライブラリーはその種でユニークではありません。 類似の「小さな」リストを提供する価値があります。
別のライブラリが必要な理由 実際、リクエストタイプの可能な範囲全体をサポートしているのではなく、ほとんどの場合、プロジェクトで必要なもののみをサポートしています。 このため、シンプルさとスピード。 また、jQueryアプローチに触発された非常にシンプルなAPI。
批判や改善の提案を聞いてうれしいです。