3

次のようなオブジェクトがあります。

var arr = {};

arr.planes = { prop1 : 'a', prop2 : 'b', prop3 : 'c' };
arr.trains = { prop1 : 'x', prop2 : 'y', prop3 : 'z' };
arr.autos = { prop1 : 'red', prop2 : 'orange', prop3 : 'blue' };

ネストされたキーと値のペアに基づいて、最も外側の配列のキー (または複数ある場合はキーの配列) を返す関数 (高速で効率的な) を作成しようとしています。何かのようなもの:

function getKey(obj, prop, val) {
   // do some stuff...
   return key;
}

var myKey = getKey(arr, 'prop2', 'orange');

myKey の値は「autos」である必要があります。

これはいくつかのネストされた for ループで実行できると確信していますが、これらの配列はかなり大きく、特に jquery の grep() を使用すると、もっと良い方法が必要になると思います... またはそうでないかもしれません -私は今のところ困惑しています。

どんな洞察も大歓迎です!!

4

2 に答える 2

3

chris のようにデータ構造を変更する以外は、これがほぼ唯一のオプションであることが示唆されています。

function getKey(obj, prop, val) {
    var keys = [];

    for (var key in obj) {
        if (obj[key].hasOwnProperty(prop) && obj[key][prop] === val) {
            keys.push(key);                
        }            
    }

    return keys;
}

ネストされたループは必要なく、各配列要素を一度だけ調べます..私の意見ではかなり効率的です。

于 2012-05-29T17:50:26.577 に答える
2

最近のブラウザでは、forループが配列に対して実行できる速度に驚かれるかもしれません。

ただし、このためにさまざまなデータ構造を維持することもできます。
いくつかのループを使用して、そのように構造化された新しいオブジェクトを構築するだけです

var map = {
    prop1: {a: ["planes"], x: ["trains"], red: ["autos"]}
  , prop2: {...}
};

function getKey(prop, val) {
   return map[prop][val] || [];
}

その時点から、ルックアップは非常に高速になります。

値はスカラーであると想定します。そうでない場合、プロパティ名として使用できるのはスカラーのみであるため、これは機能しません。

于 2012-05-29T17:47:19.900 に答える