有一种方法来获得(从某处)元素的数量在一个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对象

其他提示

要在任何ES5兼容环境为此

Object.keys(obj).length

(来自浏览器支持此处),点击 (上Object.keys 这里,包括方法,你可以添加非ECMA5浏览器)

如果的你已经在构建使用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)。据我所知,没有这样的方式中存在我害怕。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top