如何计算 JavaScript 对象的属性?

IT技术 javascript object
2021-01-19 14:55:56

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

var object = {
  "key1": "value1",
  "key2": "value2",
  "key3": "value3"
}; 

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

6个回答

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

Object.keys(myObject).length
@Andrew 我不会说“远非完全”我会说 IE8 及更低版本不支持。此外,Polyfill
2021-03-17 14:55:56
如果社区可以关闭问题,则社区应该能够更改正确答案。
2021-03-20 14:55:56
这绝对是正确的答案,它简单而优雅!@Iscariot +1:完全同意!
2021-04-06 14:55:56
如果您想编写代码来迎合技术死水,请随意。我希望您还针对 2400 波特连接优化所有代码。享受生活在过去。
2021-04-08 14:55:56
这应该是公认的答案,我不认为“但它在 IE8 中不起作用”的论点是任何借口。尝试支持它的唯一可能原因是行业是否仍在使用 Windows XP。在这种情况下,我认为切换到替代浏览器是一个更好的选择,继续开发和支持 IE8 是一条漫无目的的漫长道路,如果它只能在 IE 中运行,您将不得不在某个时候重新编写代码.
2021-04-13 14:55:56

没有简单的答案,因为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");

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

@bucabay:测试的目的是找到“foo”的那些不存在于所有其他 Object 派生物中的属性。删除测试可能会有所启发,看看计数有多高。你会发现它有几十个。只是其中之一,您会在 'foo' 和 'empty' 中找到对“hasOwnProperty()”的引用,因为“成员函数”也是对象的属性,而不仅仅是一些其他语言中的数据。
2021-03-18 14:55:56
@WarrenYoung 语句 empty.hasOwnProperty(k) 将始终为 FALSE,因为空对象没有直接属性。foo.hasOwnProperty(k) 将只返回直接属性,而不是从 Object.prototype 继承的属性。
2021-03-25 14:55:56
您不应该使用空对象来访问 Object.prototype。只需使用 Object.prototype.hasOwnProperty.call(foo, k)。
2021-03-27 14:55:56
你为什么不只做 foo.hasOwnProperty(k)。我错过了什么吗?我的意思是,即使 JavaScript 类型也从 Object.prototype 派生而来,并且它会有一个 hasOwnProperty() 方法。
2021-03-29 14:55:56
@Elijah:我看不出我这样做的方式有什么问题,但是是的,您的方式也应该可行。
2021-04-03 14:55:56

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

我在用,很爽。谢谢亚历山大。
2021-03-22 14:55:56
使用 underscore.js,您可以使用 _.size(obj)。
2021-03-29 14:55:56

您可以遍历对象以获取键或值:

function numKeys(obj)
{
    var count = 0;
    for(var prop in obj)
    {
        count++;
    }
    return count;
}

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

var object = {"key1":"value1","key2":"value2","key3":"value3"};

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

 alert(miobj[0].length) //=== undefined

这个功能很好

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
当我使用此代码时,引导程序下拉菜单不起作用
2021-03-31 14:55:56
扩展本机对象是一种不好的做法。不要这样做。
2021-04-01 14:55:56