1

バックグラウンド

すべて同じタイプのオブジェクトの配列があります。

すべて同じ型の配列のルックアップを処理するためのクラスを作成しました。クラスのポイントは、オブジェクトのプロパティに基づいてオブジェクトを探すたびに、必要以上に配列を反復処理しないようにすることです。

私のルックアップ クラスの骨組みは次のようになります。それで、あなたはそれが何をするかを理解することができます。

/**
 * @constructor
 * @param {Array} items An array of all the same type of item.
 */
titan.structs.IndexedLookup = function (items) {};

/**
 * Get by property
 * @param {String} property The property name.
 * @param {String|Number} value The property value.
 * @returns {Object|null}
 */
titan.structs.IndexedLookup.prototype.getByProperty = 
function (property, value) {};

問題

これの最後の行を使いたい

var lookup = new titan.structs.IndexedLookup(myArrayOfItems);
// Lookup by property 'id'
var item = lookup.getByProperty("id", 27);

高度なコンパイラが「id」の代わりに割り当てた実際のプロパティ名を取得する賢い方法は思いつきません。

備考

オブジェクトタイプの引用符でプロパティを使用するソリューションを探しているわけではありません。オブジェクトクラスを設計するときに、未知のコンポーネントでルックアッププロパティとして使用されるという事前の知識が必要だからです。

4

2 に答える 2

2

いくつかの解決策があります。

名前の変更を防ぐ 2 つの方法:

  • プロパティの引用を一貫して使用します。

    item['id'] = 2;
    lookup.getByProperty('id', 2);
    
  • extern 宣言を追加します。

    Object.prototype.id;
    

名前の変更を可能にする 2 つのアプローチ:

  • 次のような JSCompiler_renameProperty の宣言を追加します。

    function JSCompiler_renameProperty(prop) { return prop }
    

次のように使用します。

lookup.getByProperty(JSCompiler_renameProperty("id"), 27);

これは良くありませんが、型ベースの最適化ではうまく機能します。

  • クロージャ ライブラリの goog.reflect.object を使用します。

    var idPropName = (goog.object.transpose(goog.reflect.object(MyType, id: 1)))[1];
    

これにより、プロパティに関連付けられた型を指定でき、型ベースの最適化とうまく機能します。

于 2013-08-12T00:26:43.960 に答える
2

これは難しい問題であり、優れた解決策はありません。ディスカッションの一部を表示できます:名前の変更によるプロパティの存在のテスト

通常、コードをリファクタリングして問題を別の方法で処理する方法を見つけます。

これをサポートする機能を要求する Closure-compiler プロジェクトで問題を開くことをお勧めします。

于 2013-08-09T14:51:24.630 に答える