Javascript';第一个或默认值';用于';关联数组'/物体

Javascript';第一个或默认值';用于';关联数组'/物体,javascript,properties,Javascript,Properties,有更好的方法吗 我将值存储在一些人会错误地称之为关联数组的数组中: 标记对象存储。。。。令牌和在每db级别上使用该令牌的文档计数 var tokens = {'db1' : { '654321': { 'docCount': 1 }, '321456': { 'docCount': 2 } }, 'db2' : { '999999': { 'docCount': 1 } } }; 我可以添加/删除dbs和令牌,并适当更

有更好的方法吗

我将值存储在一些人会错误地称之为关联数组的数组中:

标记
对象存储。。。。令牌和在每db级别上使用该令牌的文档计数

var tokens = {'db1' : { '654321': { 'docCount': 1 },
                        '321456': { 'docCount': 2 } },
              'db2' : { '999999': { 'docCount': 1 } } };
我可以添加/删除dbs和令牌,并适当更新docCounts。 由于为简洁起见省略了代码,我们可以假设,如果存在db,则也存在docCount至少为1的令牌

如果数据库存在,我需要检索它的任何标记,那么最好的方法是什么? 如果dbs持有数组,那么它将像
令牌['db1'][0]
一样简单。。。但我没有使用数组

我从LINQ那里得到了如下“灵感”(请不要责怪LINQ):

这将被称为如此(例如简化):

通常根据上面的示例“654321”返回(因为这是一个对象,而不是数组,所以不能保证顺序,但在我的代码中任何一个值都是可以接受的)

  • 这是获得任何价值的合理方法吗
  • 有更好的方法吗
  • 我是不是应该把它吸起来,把所有东西都塞进一个阵列,然后用这种方式包装存储功能

更新:我已经删除了
默认
引用,因为未找到的项将是完全可以接受的
未定义
响应:

// NOTE: obj.hasOwnProperty not implemented for brevity
var firstOrAny = function(obj) {
  var thing;
  for (var i in obj) {
    thing = i;
    break;
  }
  return thing;
};
这将被称为如此(例如简化):


略短的解决方案:

var firstOrDefault = function(obj, d) { 
  for (var i in obj)
  {
    if (obj.hasOwnProperty(i))
    {
      return obj[i];
    }
  }
  return d; 
};
但是,是的,这是从对象获取任何(通常首先插入)密钥的最快方法


我还添加了一个
hasOwnProperty
检查,以防止从原型链中检索值的情况。

如果你想在js中使用linq,这是一个很好的库,谢谢,@pax162-这是我唯一需要的类似linq的函数,所以我现在还不想添加一个完整的库。我甚至需要一个类似LINQ的函数吗?@pax162同样,该库只对数组有效,对对象无效。如果我使用的是数组,我就可以访问项[0]。谢谢。在这种特殊情况下,没有原型链。我还打算删除默认值,但这很好地处理了它。我倾向于定义变量,分配变量,然后返回用于调试目的——并让其他工具压缩它们。
// 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']); }
var firstOrDefault = function(obj, d) { 
  for (var i in obj)
  {
    if (obj.hasOwnProperty(i))
    {
      return obj[i];
    }
  }
  return d; 
};