有没有办法从某个地方获取javascript对象中的元素数量? (即恒定时间复杂度)。
我无法找到检索该信息的属性或方法。到目前为止,我只能想到在整个集合中进行迭代,但这是线性时间 很奇怪,没有直接访问对象的大小,你不这么认为。
修改
我在谈论Object
对象(一般不是对象):
var obj = new Object ;
答案 0 :(得分:135)
虽然JS实现可能会在内部跟踪这样的值,但是没有标准的方法来实现它。
过去,Mozilla的Javascript变体暴露了non-standard __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的实现,也可以写成(Kudos to Avi Flax)
function countProperties(obj) {
return Object.keys(obj).length;
}
请记住,您还会错过无法枚举的属性(例如数组的length
)。
如果你正在使用像jQuery,Prototype,Mootools这样的框架,那就是最新的炒作,检查它们是否带有自己的集合API,这可能比使用本机JS对象更好地解决你的问题
答案 1 :(得分:82)
答案 2 :(得分:10)
如果你已经在构建中使用了jQuery,那就这样做:
$(yourObject).length
它对我的对象很好用,我已经把jQuery作为依赖。
答案 3 :(得分:5)
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);
答案 4 :(得分:2)
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
最后,我认为你应该放弃让你的对象可数的想法,并找出另一种方法去做你正在做的事情。
答案 5 :(得分:1)
数字/长度/维度的概念对于一个对象并没有多大意义,需要它表明你真的想要一个数组给我。
编辑:向我指出你想要一个O(1)。据我所知,恐怕没有这种方式。