【问题标题】:How do I count a JavaScript object's attributes? [duplicate]如何计算 JavaScript 对象的属性? [复制]
【发布时间】:2010-11-23 16:11:37
【问题描述】:

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

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

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

【问题讨论】:

  • 等一下! JS 没有元组,也没有字典。这称为对象(以文字表示法编写),尽管它看起来像 Python 字典。在上面的例子中,你怎么称呼元组?
  • 你建议如何重命名这个问题?
  • 也许是“属性”而不是“元组”?假设您希望上述“对象”的答案为 3。
  • 是的。它是重复的,因为我不知道如何正确询问。我们可以将其作为副本关闭。
  • 这很简单,伙计们:Object.keys(myObject).length,看我的帖子。

标签: javascript object


【解决方案1】:

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

Object.keys(myObject).length

【讨论】:

  • @Andrew 我不会说“远非完全”,我会说 IE8 及以下版本不支持。另外,Polyfill.
  • 如果社区可以关闭问题,社区应该能够更改正确答案。
  • 这绝对是正确的答案,简单而优雅! @Iscariot +1:完全同意!
  • 这应该是公认的答案,我不认为“但它在 IE8 中不起作用”的论点是任何借口。尝试支持它的唯一可能原因是业界仍在使用 Windows XP。在这种情况下,我认为切换到其他浏览器是一个更好的选择,继续开发和支持 IE8 是一条漫长的道路,没有任何进展,如果它只能在 IE 中运行,你将不得不在某个时候重新编写代码.
  • 如果您想编写代码来满足技术落后的需求,请随意。我希望您也针对 2400 波特连接优化所有代码。享受生活在过去。
【解决方案2】:

没有简单的答案,因为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原型。

【讨论】:

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

使用underscore库,非常有用:_.keys(obj).length。

【讨论】:

  • 我正在使用它,非常酷。谢谢亚历山大。
  • 加上underscore.js,可以使用_.size(obj)。
【解决方案4】:

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

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

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

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

【讨论】:

    【解决方案5】:
     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
    

    【讨论】:

    • 扩展本机对象是一种不好的做法。不要这样做。
    • 当我使用此代码时,引导下拉菜单不起作用
    【解决方案6】:

    此函数使用 Mozilla 的 __count__ 属性(如果可用),因为它比遍历每个属性更快。

    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;
    

    【讨论】:

    • 请注意,该属性在 Firefox 4 中已被弃用,并在此后不久被删除,因此它在任何浏览器中已经好几年没有出现了。
    【解决方案7】:

    编辑:这将导致 jquery 发生错误,以及其他一些不便。你不应该使用它:(也许如果可以添加一个私有方法而不是公共属性函数,这会很好,但现在没有时间)。社区维基

    不要使用:

    虽然javascript的object默认没有count函数,但是类很容易扩展,可以自己添加:

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

    这样之后就可以执行了

    var object = {'key1': 'val1', 'key2':'val2', 'key3':'val3'};
    console.log(object.count()); // 3
    

    作为结论,如果您想在对象中使用计数功能,您需要从代码块 1 中复制代码,并在执行时间的早期(在调用计数之前)将其粘贴。

    让我知道这是否适合你!

    问候, 佩德罗

    【讨论】:

    • 嗨。我已经使用了一段时间没有任何问题...我发现的唯一问题是,如果在对所有对象执行此属性后循环对象,它将执行额外的循环。如果有人能找到解决方法,那就太好了
    • 嗯?为什么不?有人可能会修复它
    • IMO 扩展标准类型不是最好的主意
    • 我同意,但我们的 ruby​​ist 社区可能不同意。 ;)
    【解决方案8】:

    对于那些将阅读此问题/答案的人,这里是 Dictionary 集合的 JavaScript 实现,与 .NET 的功能非常相似:JavaScript Dictionary

    【讨论】:

      【解决方案9】:

      虽然它不是“真正的对象”,但您总是可以这样做:

      var foo = [
        {Key1: "key1"},
        {Key2: "key2"},
        {Key3: "key3"}
      ];
      
      alert(foo.length); // === 3
      

      【讨论】:

      • 我们正在尝试获取属性的长度。因此,在您的情况下,结果应该只有 1。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-10
      • 2012-01-03
      • 2022-01-10
      • 2021-01-02
      • 2013-07-31
      相关资源
      最近更新 更多