2779

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

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

42 回答 42

3013

更新的答案

这是 2016 年的更新以及ES5及更高版本的广泛部署。 对于 IE9+ 和所有其他支持 ES5+ 的现代浏览器,您可以使用Object.keys()上面的代码:

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

Object.keys()由于现在是内置的,因此不必修改任何现有原型。

编辑:对象可以具有无法通过 Object.key 方法返回的符号属性。因此,如果不提及它们,答案将是不完整的。

符号类型被添加到语言中以创建对象属性的唯一标识符。Symbol 类型的主要好处是防止覆盖。

Object.keysObject.getOwnPropertyNames不适用于符号属性。要退回它们,您需要使用Object.getOwnPropertySymbols.

var person = {
  [Symbol('name')]: 'John Doe',
  [Symbol('age')]: 33,
  "occupation": "Programmer"
};

const propOwn = Object.getOwnPropertyNames(person);
console.log(propOwn.length); // 1

let propSymb = Object.getOwnPropertySymbols(person);
console.log(propSymb.length); // 2

较旧的答案

最可靠的答案(即捕捉到您正在尝试做的事情的意图,同时导致最少的错误)将是:

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
const myObj = {}
var size = Object.size(myObj);

JavaScript 中有一种约定,您不要向 Object.prototype 添加东西,因为它会破坏各种库中的枚举。不过,向 Object 添加方法通常是安全的。


于 2008-08-09T08:31:04.577 回答
1976

如果您知道不必担心hasOwnProperty检查,则可以通过以下方式使用Object.keys()方法:

Object.keys(myArray).length
于 2011-04-03T01:44:24.820 回答
304

更新:如果您使用的是Underscore.js(推荐,它是轻量级的!),那么您可以这样做

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

如果不是,并且您不想因任何原因弄乱 Object 属性,并且已经在使用 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;
};
于 2012-07-05T14:39:00.947 回答
65

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

这比接受的答案更好,因为它使用本机 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;
于 2013-09-01T16:12:06.933 回答
41

我不是 JavaScript 专家,但看起来你必须遍历元素并计算它们,因为 Object 没有长度方法:

var element_count = 0;
for (e in myArray) {  if (myArray.hasOwnProperty(e)) element_count++; }

@palmsey:为了公平起见,JavaScript 文档实际上明确地将 Object 类型的变量以这种方式称为“关联数组”。

于 2008-08-07T19:52:19.840 回答
38

只需使用它来获取length

Object.keys(myObject).length
于 2018-01-18T10:29:26.513 回答
35

此方法在数组中获取对象的所有属性名称,因此您可以获得该数组的长度,该长度等于对象键的长度。

Object.getOwnPropertyNames({"hi":"Hi","msg":"Message"}).length; // => 2
于 2014-07-01T12:40:34.063 回答
26

为了不弄乱原型或其他代码,您可以构建和扩展您自己的对象:

function Hash(){
    var length=0;
    this.add = function(key, val){
         if(this[key] == undefined)
         {
           length++;
         }
         this[key]=val;
    }; 
    this.length = function(){
        return length;
    };
}

myArray = new Hash();
myArray.add("lastname", "Simpson");
myArray.add("age", 21);
alert(myArray.length()); // will alert 2

如果您总是使用 add 方法,那么 length 属性将是正确的。如果您担心自己或其他人忘记使用它,您也可以将其他人发布的属性计数器添加到长度方法中。

当然,您总是可以覆盖这些方法。但即使你这样做了,你的代码也可能会明显失败,从而很容易调试。;)

于 2011-06-11T15:44:56.410 回答
22

我们可以使用以下方法找到 Object 的长度:

const myObject = {};
console.log(Object.values(myObject).length);

于 2017-05-22T13:42:23.353 回答
21

以下是检查该属性是否不在原型链上的方法并且不要忘记:

var element_count = 0;
for(var e in myArray)
    if(myArray.hasOwnProperty(e))
        element_count++;
于 2008-08-08T19:18:45.143 回答
20

这是一个完全不同的解决方案,仅适用于更现代的浏览器(Internet Explorer 9+、Chrome、Firefox 4+、Opera 11.60+ 和 Safari 5.1+)

看到这个 jsFiddle

设置你的关联数组类

/**
 * @constructor
 */
AssociativeArray = function () {};

// Make the length property work
Object.defineProperty(AssociativeArray.prototype, "length", {
    get: function () {
        var count = 0;
        for (var key in this) {
            if (this.hasOwnProperty(key))
                count++;
        }
        return count;
    }
});

现在您可以按如下方式使用此代码...

var a1 = new AssociativeArray();
a1["prop1"] = "test";
a1["prop2"] = 1234;
a1["prop3"] = "something else";
alert("Length of array is " + a1.length);
于 2013-08-02T08:49:32.727 回答
17

如果您需要一个显示其大小的关联数据结构,最好使用映射而不是对象。

const myMap = new Map();

myMap.set("firstname", "Gareth");
myMap.set("lastname", "Simpson");
myMap.set("age", 21);

console.log(myMap.size); // 3

于 2016-05-18T18:16:07.027 回答
17

<script>
myObj = {"key1" : "Hello", "key2" : "Goodbye"};
var size = Object.keys(myObj).length;
console.log(size);
</script>

<p id="myObj">The number of <b>keys</b> in <b>myObj</b> are: <script>document.write(size)</script></p>

这对我有用:

var size = Object.keys(myObj).length;
于 2018-06-06T06:51:24.540 回答
17

用于Object.keys(myObject).length获取对象/数组的长度

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

console.log(Object.keys(myObject).length); //3

于 2019-09-08T04:45:53.830 回答
16

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

于 2011-07-29T13:41:54.050 回答
16

采用:

var myArray = new Object();
myArray["firstname"] = "Gareth";
myArray["lastname"] = "Simpson";
myArray["age"] = 21;
obj = Object.keys(myArray).length;
console.log(obj)

于 2016-05-31T04:49:03.720 回答
15

@palmsey:为了公平起见,JavaScript 文档实际上明确地将 Object 类型的变量以这种方式称为“关联数组”。

公平地说,@palmsey 他是完全正确的。它们不是关联数组;它们绝对是对象 :) - 完成关联数组的工作。但是就更广泛的观点而言,根据我发现的这篇相当不错的文章,您似乎绝对拥有它的权利:

JavaScript“关联数组”被认为是有害的

但是根据这一切,公认的答案本身就是不好的做法吗?

为 Object 指定原型 size() 函数

如果在 Object .prototype 中添加了任何其他内容,则建议的代码将失败:

<script type="text/javascript">
Object.prototype.size = function () {
  var len = this.length ? --this.length : -1;
    for (var k in this)
      len++;
  return len;
}
Object.prototype.size2 = function () {
  var len = this.length ? --this.length : -1;
    for (var k in this)
      len++;
  return len;
}
var myArray = new Object();
myArray["firstname"] = "Gareth";
myArray["lastname"] = "Simpson";
myArray["age"] = 21;
alert("age is " + myArray["age"]);
alert("length is " + myArray.size());
</script>

我不认为该答案应该是公认的答案,因为如果您在同一执行上下文中运行任何其他代码,则无法信任它可以工作。要以稳健的方式执行此操作,您肯定需要在 myArray 中定义 size 方法,并在遍历成员时检查成员的类型。

于 2008-08-08T22:34:56.557 回答
15

最简单的方法是这样的:

Object.keys(myobject).length

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

于 2018-05-30T15:41:40.273 回答
12

这样的事情怎么办——

function keyValuePairs() {
    this.length = 0;
    function add(key, value) { this[key] = value; this.length++; }
    function remove(key) { if (this.hasOwnProperty(key)) { delete this[key]; this.length--; }}
}
于 2011-08-24T14:26:28.887 回答
12

如果我们有哈希

哈希= {“a”:“b”,“c”:“d”};

我们可以使用键的长度来获得长度,也就是哈希的长度:

键(哈希).length

于 2014-02-09T06:48:50.453 回答
12
var myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
  1. Object.values(myObject).length
  2. Object.entries(myObject).length
  3. Object.keys(myObject).length
于 2018-04-05T23:45:02.843 回答
11

如果您使用的是AngularJS 1.x,您可以通过创建过滤器并使用任何其他示例中的代码来以 AngularJS 的方式执行操作,例如:

// Count the elements in an object
app.filter('lengthOfObject', function() {
  return function( obj ) {
    var size = 0, key;
    for (key in obj) {
      if (obj.hasOwnProperty(key)) size++;
    }
   return size;
 }
})

用法

在您的控制器中:

$scope.filterResult = $filter('lengthOfObject')($scope.object)

或者在你看来:

<any ng-expression="object | lengthOfObject"></any>
于 2015-09-15T19:15:04.340 回答
10
const myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;

console.log(Object.keys(myObject).length)

// o/p 3
于 2020-01-11T12:54:04.210 回答
9

上述某些内容的变体是:

var objLength = function(obj){    
    var key,len=0;
    for(key in obj){
        len += Number( obj.hasOwnProperty(key) );
    }
    return len;
};

集成 hasOwnProp 是一种更优雅的方式。

于 2011-11-18T18:06:41.627 回答
9

如果您不关心是否支持 Internet Explorer 8 或更低版本,您可以通过应用以下两个步骤轻松获取对象中的属性数量:

  1. 运行以获取仅包含可枚举Object.keys()属性名称的数组,或者如果您还想包含不可枚举属性的名称。Object.getOwnPropertyNames()
  2. 获取该.length数组的属性。

如果您需要多次执行此操作,可以将此逻辑包装在一个函数中:

function size(obj, enumerablesOnly) {
    return enumerablesOnly === false ?
        Object.getOwnPropertyNames(obj).length :
        Object.keys(obj).length;
}

如何使用此特定功能:

var myObj = Object.create({}, {
    getFoo: {},
    setFoo: {}
});
myObj.Foo = 12;

var myArr = [1,2,5,4,8,15];

console.log(size(myObj));        // Output : 1
console.log(size(myObj, true));  // Output : 1
console.log(size(myObj, false)); // Output : 3
console.log(size(myArr));        // Output : 6
console.log(size(myArr, true));  // Output : 6
console.log(size(myArr, false)); // Output : 7

另请参阅此 Fiddle以获取演示。

于 2016-03-07T13:13:53.933 回答
6

这是詹姆斯科根答案的不同版本。无需传递参数,只需制作 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/

于 2013-06-26T23:47:45.590 回答
5

您总是可以得到与普通数组Object.getOwnPropertyNames(myObject).length相同的结果。[].length

于 2016-01-12T01:37:43.437 回答
5

您可以简单地Object.keys(obj).length在任何对象上使用以获取其长度。Object.keys 返回一个包含所有对象(属性)的数组,可以方便地使用相应数组的长度来查找该对象的长度。你甚至可以为此编写一个函数。让我们发挥创意并为它编写一个方法(以及更方便的 getter 属性):

function objLength(obj)
{
  return Object.keys(obj).length;
}

console.log(objLength({a:1, b:"summit", c:"nonsense"}));

// Works perfectly fine
var obj = new Object();
obj['fish'] = 30;
obj['nullified content'] = null;
console.log(objLength(obj));

// It also works your way, which is creating it using the Object constructor
Object.prototype.getLength = function() {
   return Object.keys(this).length;
}
console.log(obj.getLength());

// You can also write it as a method, which is more efficient as done so above

Object.defineProperty(Object.prototype, "length", {get:function(){
    return Object.keys(this).length;
}});
console.log(obj.length);

// probably the most effictive approach is done so and demonstrated above which sets a getter property called "length" for objects which returns the equivalent value of getLength(this) or this.getLength()

于 2016-09-17T01:48:20.517 回答
4

实现此目的的一个好方法(仅限 Internet Explorer 9+)是在 length 属性上定义一个魔术 getter:

Object.defineProperty(Object.prototype, "length", {
    get: function () {
        return Object.keys(this).length;
    }
});

你可以像这样使用它:

var myObj = { 'key': 'value' };
myObj.length;

它会给1.

于 2017-07-04T15:20:39.453 回答
3

下面是 James Coglan 在 CoffeeScript 中为那些放弃直接 JavaScript 的人提供的答案:)

Object.size = (obj) ->
  size = 0
  size++ for own key of obj
  size
于 2013-03-04T17:38:43.470 回答
3

财产

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

采用

var o = {a: 1, b: 2, c: 3};
alert(o.length); // <-- 3
o['foo'] = 123;
alert(o.length); // <-- 4
于 2015-01-06T19:10:35.450 回答
3

使用 ECMAScript 6 内置的 Reflect 对象,您可以轻松计算对象的属性:

Reflect.ownKeys(targetObject).length

它将为您提供目标对象自身属性的长度(重要)。

Reflect.ownKeys(target)

返回目标对象自己的(非继承的)属性键的数组。

这是什么意思?为了解释这一点,让我们看看这个例子。

function Person(name, age){
  this.name = name;
  this.age = age;
}

Person.prototype.getIntro= function() {
  return `${this.name} is ${this.age} years old!!`
}

let student = new Person('Anuj', 11);

console.log(Reflect.ownKeys(student).length) // 2
console.log(student.getIntro()) // Anuj is 11 years old!!

您可以在此处看到,它只返回自己的属性,而对象仍在从其父级继承属性。

有关更多信息,请参阅:反射 API

于 2020-03-05T08:07:51.200 回答
2

像大多数 JavaScript 问题一样,有很多解决方案。您可以扩展像许多其他语言的字典(+ 一等公民)一样工作得更好或更坏的对象。这没有错,但另一种选择是构造一个满足您特定需求的新对象。

function uberject(obj){
    this._count = 0;
    for(var param in obj){
        this[param] = obj[param];
        this._count++;
    }
}

uberject.prototype.getLength = function(){
    return this._count;
};

var foo = new uberject({bar:123,baz:456});
alert(foo.getLength());
于 2014-05-09T18:45:09.060 回答
2

尝试:Object.values(theObject).length

const myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
console.log(Object.values(myObject).length);

于 2021-04-17T08:36:44.247 回答
1

简单的解决方案:

  var myObject = {};      // ... your object goes here.

  var length = 0;

  for (var property in myObject) {
    if (myObject.hasOwnProperty(property)){
      length += 1;
    }
  };

  console.log(length);    // logs 0 in my example.
于 2015-04-11T14:33:17.950 回答
1

在这里你可以给出任何类型的变量数组、对象、字符串

function length2(obj){
    if (typeof obj==='object' && obj!== null){return Object.keys(obj).length;}
    if (Array.isArray){return obj.length;}
    return obj.length;

}
于 2021-12-19T16:33:32.313 回答
0

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

代码

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
于 2016-08-07T16:28:48.770 回答
0

Object.keys在对象继承的情况下不返回正确的结果。要正确计算对象属性(包括继承的属性),请使用for-in. 例如,通过以下函数(相关问题):

var objLength = (o,i=0) => { for(p in o) i++; return i }

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

var child = Object.create(myObject);
child["sex"] = "male";

var objLength = (o,i=0) => { for(p in o) i++; return i }

console.log("Object.keys(myObject):", Object.keys(myObject).length, "(OK)");
console.log("Object.keys(child)   :", Object.keys(child).length, "(wrong)");
console.log("objLength(child)     :", objLength(child), "(OK)");

于 2019-02-13T04:15:19.387 回答
0

简单的一个班轮:

console.log(Object.values({id:"1",age:23,role_number:90}).length);

于 2020-10-06T18:24:32.347 回答
-1
 vendor = {1: "", 2: ""}
 const keysArray = Object.keys(vendor)
 const objectLength = keysArray.length
 console.log(objectLength)
 Result 2
于 2021-10-21T22:09:56.457 回答
-2

我有类似的需要来计算通过 websocket 接收的对象使用的带宽。简单地找到 Stringified 对象的长度对我来说就足够了。

websocket.on('message', data => {
    dataPerSecond += JSON.stringify(data).length;
}
于 2019-08-16T14:00:40.597 回答
-4

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

var size = JSON.stringify(myObject).length;

document.write(size);

JSON.stringify(myObject)

于 2018-04-09T10:24:09.310 回答