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

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

当前回答

上述部分的变化如下:

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

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

其他回答

更新:如果您使用Undercore.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;
};

如果您使用的是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>

使用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!!

您可以在这里看到,当对象仍然从其父对象继承属性时,它只返回了自己的财产。

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

如果我们有哈希

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

我们可以使用密钥的长度来获得长度,即哈希的长度:

密钥(哈希).length

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

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

var myObject=新对象();myObject[“firstname”]=“Gareth”;myObject[“lastname”]=“Simpson”;myObject[“age”]=21;var child=对象.create(myObject);child[“sex”]=“男性”;var objLength=(o,i=0)=>{for(p in o)i++;return i}console.log(“Object.keys(myObject):”,Object.keyes(myObject).length,“(OK)”);console.log(“Object.keys(child):”,Object.keyes(child).length,“(错误)”);console.log(“objLength(child):”,objLength“child),”(OK)“);