元件在一个javascript对象数
-
12-09-2019 - |
题
有一种方法来获得(从某处)元素的数量在一个javascript对象?? (即常数时间复杂度)。
我不能发现检索该信息的属性或方法。到目前为止,我只能认为这样做在整个collection进行迭代的,但是这是线性时间。结果 很奇怪有对象的大小没有直接的访问,你不觉得。
修改强>结果
我说的是Object
对象(未在一般对象):
var obj = new Object ;
解决方案
虽然JS实现可能在内部保持这样的价值的轨道,也没有标准的方式来得到它。
在过去,Mozilla的变体的Javascript露出的非 - 标准__count__
,但它已用1.8.5版移除。
对于跨浏览器脚本你坚持明确遍历性和检查hasOwnProperty()
:
function countProperties(obj) {
var count = 0;
for(var prop in obj) {
if(obj.hasOwnProperty(prop))
++count;
}
return count;
}
在的ECMAScript 5能够实现的情况下,这也可以被写为(奖励来阿维亚麻)
function countProperties(obj) {
return Object.keys(obj).length;
}
请记住,你也将错过哪些是不可枚举的属性(例如数组的length
)。
如果您正在使用像jQuery,原型,MooTools的框架,无论$最最新的炒作,检查他们是否带着自己收藏的API,这可能是一个更好的解决问题的方法比使用本地JS对象
其他提示
如果的你已经在构建使用jQuery只是这样做:
$(yourObject).length
它可以很好地为我的对象,我已经有jQuery的作为扶养。
function count(){
var c= 0;
for(var p in this) if(this.hasOwnProperty(p))++c;
return c;
}
var O={a: 1, b: 2, c: 3};
count.call(O);
AFAIK,也没有办法来可靠地做到这一点,除非切换到一个数组。这说实话,的不的看起来很奇怪 - 这似乎很直截了当,我认为阵列可数,而对象不是
也许你会得到最接近的是这样
// Monkey patching on purpose to make a point
Object.prototype.length = function()
{
var i = 0;
for ( var p in this ) i++;
return i;
}
alert( {foo:"bar", bar: "baz"}.length() ); // alerts 3
但是,这会产生问题,或至少问题。所有用户创建的属性进行计数,包括_length函数本身!虽然在这个简单的例子,你可以通过只使用一个正常功能避免它,这并不意味着你可以这样做停止其他脚本。所以你会怎么做?忽略功能属性?
Object.prototype.length = function()
{
var i = 0;
for ( var p in this )
{
if ( 'function' == typeof this[p] ) continue;
i++;
}
return i;
}
alert( {foo:"bar", bar: "baz"}.length() ); // alerts 2
在最后,我认为你应该抛弃使你的对象可数的想法,并找出另一种方式做到不管它是你正在做的。
数/长/维度的概念,并没有真正意义上的对象,并且需要它表明你真的想要一个数组给我。
编辑:指给我说,你要为这个的O(1)。据我所知,没有这样的方式中存在我害怕。