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;
};