如果我有 JavaScript 关联数组,说︰

var myArray = new Object();
myArray["firstname"] = "Gareth";
myArray["lastname"] = "Simpson";
myArray["age"] = 21;

有没有内置或接受最佳实践方法来获取此数组的长度?

JavaScript 没有关联数组,它仅有对象,它可以用作关联数组的概念.**

2008-08-07 19:42:21
问题评论:

在 javascript 对象文本是通过默认关联数组如 object.propertyName.propertyValue 等同于对象 [属性] [属性值]

在执行此操作的 Underscore.js 中添加一行式命令︰ stackoverflow.com/a/11346637/11236

后行答案是使用 Object.keys (myArray) 为 @aeosynth.length 说。

@neitony-比较正确的但这么多人习惯于 PHP 的"相关数组",他们可能认为它意味着"有序关联图",当 JS 对象实际上是无序。

好吧,怎么样Object.keys(obj).length

回答:

最可靠的答案 (即捕获您尝试执行操作而导致少 bug 的意图) 应为︰

Object.size = function(obj) {
    var size = 0, key;
    for (key in obj) {
        if (obj.hasOwnProperty(key)) size++;
    }
    return size;
};

// Get the size of an object
var size = Object.size(myArray);

没有一种约定的 JavaScript,不要添加到 Object.prototype 的东西,因为它会中断不同库中的枚举。向对象添加方法通常是安全,但是。


这里是截至 2016年和广泛部署的 ES5 内外更新。IE9 + 和所有其他现代 ES5 + 支持的浏览器,您可以使用Object.keys() ,所以上面的代码只是成为︰

var size = Object.keys(myObj).length;

这并不一定因为现在内置Object.keys()修改任何现有的原型。

@Tres-您的代码可以被破坏,如果有人将会覆盖大小属性,在不知道它已某处代码中声明,因此值得始终检查是否已定义

@vsync 您是非常正确的。一个始终应实现必要健全检测:)

@Tres︰ 考虑您 doppelganger 编写了 Object.size() 基-1,并已就断开您的代码。他不但是因为您应该编写它以不同的方式处理。

为什么每个人都忽视这︰ Object.keys(obj).length

@MuhammadUmer 可能是因为编写此答案时,即使不存在该方法。即使到了今天,它可能需要旧式旧浏览器。

如果您知道您不必担心hasOwnProperty检查,你可以非常简单︰

Object.keys(myArray).length

为什么不呢?从我知道的它是一种标准︰ developer.mozilla.org/en/JavaScript/Reference/Global_Objects/...

它不是普遍实施的方法,但您可以检查哪些浏览器使用此表支持.

没有 IE8 支持 = 不转。

若要切换到 firefox 的时间 = 遗憾的是,您可以切换并不意味着您的网站的用户将...

@ripper234 不支持 IE = 时间填充代码

更新︰ 如果您使用的Underscore.js (建议这样做,它是轻量级 !),然后您就可以执行

_.size({one : 1, two : 2, three : 3});
=> 3

如果不是,并且您不想浪费时间与对象属性,无论出于什么原因,和已在使用 jQuery,是同样可访问的插件︰

$.assocArraySize = function(obj) {
    // http://stackoverflow.com/a/6700/11236
    var size = 0, key;
    for (key in obj) {
        if (obj.hasOwnProperty(key)) size++;
    }
    return size;
};

_.size()是我的流星项目,其中有 underscore.js 支持的最佳解决方案。

我使用下划线,这篇文章只是提醒我,我没有使用它足够在此项目中。如果您要处理的对象,应具有可用的 underscore.js。

有关 Underscore.js 的更新是什么能满足您的 upvote 从我,我的朋友:)

下划线 > (所有-['lo-dash'])

underscorejs,:) 应该是在 js 的事情

不是简单的原因︰

Object.keys(obj).length

它并不一定是很困难,肯定不需要另一个函数来完成。

如何这是不同于 aeosynth 的答案?

您见过的这个问题的答案吗?当我写了它时,我没有看到 (几个) 的重复项。James Coglan 回答这种方式在 aeosynth 之前, 的 3 年使您没有阅读所有的回答...或您会看到过的。

这是最的跨浏览器解决方案。

这是优于接受的答案,因为它使用本机 Object.keys,如果存在。因此,它是对所有现代浏览器速度最快。

if (!Object.keys) {
    Object.keys = function (obj) {
        var arr = [],
            key;
        for (key in obj) {
            if (obj.hasOwnProperty(key)) {
                arr.push(key);
            }
        }
        return arr;
    };
}

Object.keys(obj).length;

Object.keys()返回一个数组,其中包含所可枚举的属性的名称。如果您想包含所有属性的数组,则应该使用Object.getOwnPropertyNames()请参阅developer.mozilla.org/en/docs/Web/JavaScript/Reference/...

请输入您的翻译

Length of a JavaScript object (that is, associative array)

确认取消