使用Jquery计算对象字面量中的对象数量

7

代码:

var animals = {
                    "elephant": {
                                    "name" : "Bingo",
                                    "age" : "4"
                                },
                    "Lion":     {
                                    "name" : "Tango",
                                    "age" : "8"
                                },
                    "Tiger":    {
                                    "name" : "Zango",
                                    "age" : "7"
                                }
                }

我想使用Jquery在这个对象字面量中计算对象的数量。
3个回答

22

您可以使用Object.keys(animals).length

或者

var count = 0;
for (var animal in animals) {
    if (animals.hasOwnProperty(animal)) {
        count++;
    }
}
// `count` now holds the number of object literals in the `animals` variable

或者使用许多jQuery解决方案之一,这些解决方案可能是最有效的也可能不是:

var count = $.map(animals, function(n, i) { return i; }).length;

1

如果你想要一个跨浏览器的东西,同时也能在IE8上工作,那么你不能以一种非常干净的方式来实现它(请参见键属性的兼容性)。

我建议这样做:

var n = 0;
for (var _ in animals) n++;

由于它是一个对象文字,所以不需要使用hasOwnProperty。


是的,因为使用对象填充并污染原型是不可能的...最好还是保险点。 - Ian
这并非不可能,但你的代码不应该防范疯狂行为。任何理智的人在添加一个属性到对象的原型时至少会使其不可枚举... - Denys Séguret
疯狂?是的,那很疯狂! - Ian
除了Object.defineProperty,你还可以用什么方式定义一个不可枚举的属性呢?(只是好奇,不太确定) - Ian
使用Object.create可以创建对象,但如果要修改对象的原型(这是我不习惯的),我认为你需要使用defineProperty。 - Denys Séguret
所以我刚刚查看了MDN提供的Object.keys的polyfill,他们没有扩展原型 - 他们只是使用Object.keys = function() { //definition };,所以它似乎是不可枚举的。但是这是否会为每个构造的字符串创建一个新的“keys”方法,而不是共享通用原型方法?我猜他们这样做是为了避免这个可枚举问题,即使它需要付出一些小代价? - Ian

-1

你不能使用数组吗?

无论如何,在对象中,你可以这样做:

Object.prototype.length = function() {
    var count = 0, k=null;
    for (k in this) {
        if (this.hasOwnProperty(k)) count++;
    }
    return count;
}
console.log( animals.length() );

3
如果他需要为自己的属性命名,就不能使用数组,修改对象原型不被认为是一种好的实践,特别是当存在 Object.keys 方法可以用于此目的时。该方法可以返回一个包含键名的数组,并具有长度属性。 - Moritz Roessler
Object.keys是EcmaScript 5的标准,不适用于IE8或更低版本。但无论如何,您可以使用Array并为属性命名: var things = []; things ['someShit'] ='你好'; things ['someShit2'] ='世界!';console.log(things.someShit+' '+things.someShit2); - neiker
1
给数组命名键也是一个不好的想法,因为它会破坏一些数组方法,比如slice或forEach(这些方法会忽略已命名的键),而且你还必须使用Object.keys()来获取长度或者用keys去遍历数组,只是举几个例子。在这里有一个http://jsbin.com/anixap/1/edit的工作。抱歉拼写错误,我在使用手机。 - Moritz Roessler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接