如何计算JavaScript对象的属性?

Eug*_*ica 160 javascript object

假设我在JavaScript中有以下对象:

var object = {
  "key1": "value1",
  "key2": "value2",
  "key3": "value3"
}; 
Run Code Online (Sandbox Code Playgroud)

如何找出对象中存在多少个值?

dea*_*unk 497

你可以使用这个简单的代码来做到这一点:

Object.keys(myObject).length
Run Code Online (Sandbox Code Playgroud)

  • @Andrew我不会说"远非完全"我会说IE8及以下版本不支持.另外,[Polyfill](http://jsperf.com/polyfill-object-keys). (19认同)
  • 如果社区可以关闭问题,社区应该能够改变正确的答案. (19认同)
  • 这应该是正确的答案,它简单而优雅!@Iscariot +1:不能同意! (10认同)
  • 这应该是公认的答案,我不认为"但它在IE8中不起作用"的论点是任何借口.试图支持它的唯一可能原因是行业仍在使用Windows XP.在这种情况下,我认为切换到另一种浏览器是一个更好的选择,继续开发和支持IE8是一条漫长的道路,如果只能在IE中运行,你将不得不在某些时候重新编写代码. (7认同)
  • 如果您想编写代码以迎合技术回水,请随意.我希望你也优化所有2400波特连接的代码.享受过去的生活. (4认同)
  • 这远非完全支持:http://kangax.github.io/es5-compat-table/ (2认同)

War*_*ung 104

没有简单的答案,因为Object- JavaScript中的每个对象都来自 - 自动包含许多属性,并且您获得的确切属性集取决于特定的解释器以及在您之前执行的代码.所以,你不得不将你定义的那些与你"免费"获得的那些分开.

这是一种方式:

var foo = {"key1": "value1", "key2": "value2", "key3": "value3"};
Object.prototype.foobie = 'bletch'; // add property to foo that won't be counted

var count = 0;
for (var k in foo) {
    if (foo.hasOwnProperty(k)) {
       ++count;
    }
}
alert("Found " + count + " properties specific to foo");
Run Code Online (Sandbox Code Playgroud)

第二行显示了其他代码如何为所有Object派生类添加属性.如果删除hasOwnProperty()循环内的检查,属性计数将至少达到4.在除此代码之外的其他JavaScript的页面上,如果其他代码也修改Object原型,则可能高于4 .

  • 您不应该使用空对象来访问Object.prototype.只需使用Object.prototype.hasOwnProperty.call(foo,k). (3认同)
  • @bucabay:测试的目的是找到'foo'的那些属性,这些属性并不存在于每个其他Object派生物上.删除测试可能很有启发性,看看计数有多高.你会发现它在几十个.只有一个,你会在'foo'和'empty'中找到对"hasOwnProperty()"的引用,因为"成员函数"也是对象的属性,而不仅仅是其他语言中的数据. (2认同)

jo_*_*ura 49

使用下划线库,非常有用:_.keys(obj).length.

  • 使用underscore.js,您可以使用_.size(obj). (7认同)
  • 似乎是一个非常有用的库. (3认同)

nex*_*ays 12

您可以迭代对象以获取键或值:

function numKeys(obj)
{
    var count = 0;
    for(var prop in obj)
    {
        count++;
    }
    return count;
}
Run Code Online (Sandbox Code Playgroud)

它看起来像是一个"拼写错误"但只是想指出你的例子是无效的语法,应该是

var object = {"key1":"value1","key2":"value2","key3":"value3"};
Run Code Online (Sandbox Code Playgroud)


小智 12

 var miobj = [
  {"padreid":"0", "sw":"0", "dtip":"UNO", "datos":[]},
  {"padreid":"1", "sw":"0", "dtip":"DOS", "datos":[]}
 ];
 alert(miobj.length) //=== 2
Run Code Online (Sandbox Code Playgroud)

 alert(miobj[0].length) //=== undefined
Run Code Online (Sandbox Code Playgroud)

这个功能非常好

Object.prototype.count = function () {
    var count = 0;
    for(var prop in this) {
        if(this.hasOwnProperty(prop))
            count = count + 1;
    }
    return count;
}

alert(miobj.count()) // === 2
alert(miobj[0].count()) // === 4
Run Code Online (Sandbox Code Playgroud)

  • 扩展本机对象是一种不好的做法.不要这样做. (4认同)

Eli*_*rey 5

__count__如果它可用,则此函数使用Mozilla的属性,因为它比迭代每个属性更快.

function countProperties(obj) {
  var count = "__count__",
  hasOwnProp = Object.prototype.hasOwnProperty;

  if (typeof obj[count] === "number" && !hasOwnProp.call(obj, count)) {
    return obj[count];
  }
  count = 0;
  for (var prop in obj) {
    if (hasOwnProp.call(obj, prop)) {
      count++;
    }
  }
  return count;
};

countProperties({
  "1": 2,
  "3": 4,
  "5": 6
}) === 3;
Run Code Online (Sandbox Code Playgroud)