有没有办法(从某处)获取 Javascript 对象中的元素数量? (即恒定时间复杂度)。
我找不到检索该信息的属性或方法。到目前为止,我只能想到对整个集合进行迭代,但这是线性时间。
奇怪的是,无法直接访问对象的大小,您不觉得吗?
编辑:
我说的是
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 的实现,这也可以写成(感谢Avi Flax)
function countProperties(obj) {
return Object.keys(obj).length;
}
请记住,您还会错过不可枚举的属性(例如数组的
length
)。
如果您使用的是 jQuery、Prototype、Mootools、$whatever-the-newest-hype 等框架,请检查它们是否带有自己的集合 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) 。据我所知,恐怕不存在这样的方法。
使用 jquery :
$(parent)[0].childElementCount
您可以使用:
Object.keys(obj).length