1

これを行うより良い方法はありますか?

一部の人が誤って関連付けられた配列と呼ぶものに値を格納しています。

オブジェクトには、tokensトークンと、データベースごとのレベルでそのトークンを使用するドキュメントの数が格納されます。

var tokens = {'db1' : { '654321': { 'docCount': 1 },
                        '321456': { 'docCount': 2 } },
              'db2' : { '999999': { 'docCount': 1 } } };

データベースとトークンを追加/削除し、docCounts を適切に更新できます。簡潔にするためにコードが省略されているため、データベースが存在する場合、少なくとも 1 の docCount を持つトークンも存在すると想定できます。

データベースが存在し、そのトークンのいずれかを取得する必要がある場合、最良の方法は何ですか? データベースが配列を保持していれば、tokens['db1'][0]...と同じくらい簡単ですが、私は配列を使用していません。

私はLINQに「触発された」次のようなものを持っています(LINQを責めないでください):

// NOTE: default not implemented here
var firstOrDefault = function(obj) {
  var thing;
  for (var i in obj) {
    thing = i;
    break;
  }
  return thing;
};

これは次のように呼び出されます(たとえば簡略化されています):

var anyToken;
if (tokens['db1') { anyToken = firstOrDefault(tokens['db1']); }

通常、上記の例 '654321' に従って返されます (これは配列ではなくオブジェクトであるため、順序は保証されませんが、私のコードではどちらの値も受け入れられます)。

  • これは値を取得するための合理的な方法ですか?
  • より良い方法はありますか?
  • それを吸い上げて、すべてをアレイに押し込み、ストレージ機能をそのようにラップする必要がありますか?

更新: 参照を削除しましdefaultた。見つからないアイテムは完全に受け入れられるundefined応答になるためです。

// NOTE: obj.hasOwnProperty not implemented for brevity
var firstOrAny = function(obj) {
  var thing;
  for (var i in obj) {
    thing = i;
    break;
  }
  return thing;
};

これは次のように呼び出されます(たとえば簡略化されています):

var anyToken;
if (tokens['db1') { anyToken = firstOrAny(tokens['db1']); }
4

1 に答える 1

3

少し短い解決策:

var firstOrDefault = function(obj, d) { 
  for (var i in obj)
  {
    if (obj.hasOwnProperty(i))
    {
      return obj[i];
    }
  }
  return d; 
};

しかし、はい、オブジェクトから (通常は最初に挿入された) キーを取得する最速の方法です。

hasOwnPropertyまた、値がプロトタイプ チェーンから取得されるケースを防ぐためのチェックを追加しました。

于 2013-10-23T14:45:27.027 に答える