1

有一个更好的方法吗?

我将值存储在某些人会错误地称为关联数组的位置:

tokens对象存储....令牌和在每个数据库级别上使用该令牌的文档计数。

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

我可以添加/删除 dbs 和令牌并适当地更新 docCounts。由于为简洁而省略了代码,我们可以假设,如果一个 db 存在,那么一个令牌也存在,其 docCount 至少为 1。

如果一个数据库存在并且我需要检索它的任何令牌,那么最好的方法是什么?如果 dbs 持有数组,它会像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 回答