我有一个JavaScript对象。是否有一种内置或公认的最佳实践方法来获取此对象的长度?

const myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;

当前回答

简单的内衬:

console.log(Object.values({id:“1”,年龄:23,角色编号:90}).length);

其他回答

最简单的方法如下:

Object.keys(myobject).length

其中myobject是您想要的长度的对象。

这里有一个不同版本的詹姆斯·科根的答案。不要传递参数,只需将Object类原型化并使代码更干净。

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

var x = {
    one: 1,
    two: 2,
    three: 3
};

x.size() === 3;

jsfiddle示例:http://jsfiddle.net/qar4j/1/

该解决方案适用于多种情况和跨浏览器:

Code

var getTotal = function(collection) {

    var length = collection['length'];
    var isArrayObject =  typeof length == 'number' && length >= 0 && length <= Math.pow(2,53) - 1; // Number.MAX_SAFE_INTEGER

    if(isArrayObject) {
        return collection['length'];
    }

    i= 0;
    for(var key in collection) {
        if (collection.hasOwnProperty(key)) {
            i++;
        }
    }

    return i;
};

数据示例:

// case 1
var a = new Object();
a["firstname"] = "Gareth";
a["lastname"] = "Simpson";
a["age"] = 21;

//case 2
var b = [1,2,3];

// case 3
var c = {};
c[0] = 1;
c.two = 2;

用法

getLength(a); // 3
getLength(b); // 3
getLength(c); // 2

我同样需要计算通过websocket接收的对象所使用的带宽。对我来说,只要找到Stringified对象的长度就足够了。

websocket.on('message', data => {
    dataPerSecond += JSON.stringify(data).length;
}

在某些情况下,最好将大小存储在单独的变量中。特别是,如果要在一个位置添加一个元素到数组中,并且可以很容易地增加大小。如果你需要经常检查尺寸的话,这显然会更快。