JavaScript对象的长度

JavaScript对象的长度,javascript,javascript-objects,Javascript,Javascript Objects,我有一个JavaScript对象。是否有一种内置的或公认的最佳实践方法来获取此对象的长度 const myObject = new Object(); myObject["firstname"] = "Gareth"; myObject["lastname"] = "Simpson"; myObject["age"] = 21; 我不是JavaScript专家,但由于Object没有length

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

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

我不是JavaScript专家,但由于Object没有length方法,所以看起来您必须循环遍历元素并计算它们:

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

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

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

var element_count = 0;
for(var e in myArray)
    if(myArray.hasOwnProperty(e))
        element_count++;
@palmsey:公平地说,JavaScript文档实际上明确地将使用Object类型的变量称为“关联数组”

对@palmsey公平地说,他是完全正确的。它们不是关联数组;它们绝对是对象:)-执行关联数组的工作。但关于更广泛的一点,根据我发现的这篇相当不错的文章,你似乎绝对有权这样做:

但根据这一切,这本身就是一种坏习惯吗

为对象指定prototype 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>

Object.prototype.size=函数(){
var len=this.length?--this.length:-1;
for(在本例中为var k)
len++;
回程透镜;
}
Object.prototype.size2=函数(){
var len=this.length?--this.length:-1;
for(在本例中为var k)
len++;
回程透镜;
}
var myArray=新对象();
myArray[“firstname”]=“Gareth”;
myArray[“lastname”]=“Simpson”;
myArray[“年龄”]=21;
警报(“年龄为”+myArray[“年龄”]);
警报(“长度为”+myArray.size());
我认为这个答案不应该被接受,因为如果您有任何其他代码在相同的执行上下文中运行,那么它就不能被信任工作。要以健壮的方式执行此操作,您当然需要在myArray中定义size方法,并在遍历成员时检查成员的类型。

最健壮的答案(即,在导致最少错误的同时捕获您尝试执行的操作的意图)是:

Object.size=函数(obj){
变量大小=0,
钥匙
用于(输入obj){
if(obj.hasOwnProperty(key))size++;
}
返回大小;
};
//获取对象的大小
常量myObj={}

var size=Object.size(myObj)
如果您知道不必担心
hasOwnProperty
检查,您可以非常简单地执行此操作:

Object.keys(myArray).length

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

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属性将是正确的。如果您担心自己或其他人忘记使用它,您可以将其他人已发布的属性计数器添加到length方法中


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

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

像这样的东西怎么样--


上述部分内容的变化如下:

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

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

更新版:如果您正在使用(推荐,它是轻量级的!),那么您只需执行以下操作即可

_.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;
};

下面是James Coglan在CoffeeScript中为那些放弃纯JavaScript的人提供的答案的一个版本:)


这是詹姆斯·科根答案的另一个版本。不要传递参数,只需对对象类进行原型化,并使代码更清晰

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;

jshiddle示例:

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

设置关联数组类

/**
 * @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);

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

这比接受的答案要好,因为它使用本机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;
如果我们有大麻

散列={“a”:“b”,“c”:“d”}

我们可以使用键的长度(即散列的长度)获得长度:

密钥(散列)。长度


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

Object.getOwnPropertyNames({"hi":"Hi","msg":"Message"}).length; // => 2
如果您使用的是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>


您始终可以执行
Object.getOwnPropertyNames(myObject).length
以获得与
[]相同的结果。length
将为普通数组提供支持。

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

  • 运行以获取仅包含不可枚举属性名称的数组,或者如果还希望包含不可枚举属性名称的数组
  • 获取该数组的属性

  • 如果需要多次执行此操作,可以将此逻辑包装到函数中:

    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
    
    如何使用此特定功能:

    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
    

    另请参见演示。

    如果需要显示其大小的关联数据结构,最好使用贴图而不是对象

    constmymap=newmap();
    myMap.set(“firstname”、“Gareth”);
    myMap.set(“姓氏”、“辛普森”);
    myMap.set(“年龄”,21岁);
    console.log(myMap.size);//3
    U
    Object.defineProperty(Object.prototype, "length", {
        get: function () {
            return Object.keys(this).length;
        }
    });
    
    var myObj = { 'key': 'value' };
    myObj.length;
    
    Object.keys(myObject).length
    
    var myObject = new Object();
    myObject["firstname"] = "Gareth";
    myObject["lastname"] = "Simpson";
    myObject["age"] = 21;
    
    Object.keys(myobject).length
    
    const myObject = new Object();
    myObject["firstname"] = "Gareth";
    myObject["lastname"] = "Simpson";
    myObject["age"] = 21;
    
    console.log(Object.keys(myObject).length)
    
    // o/p 3