JavaScript对象的长度

aet 发布于 2018-03-05 javascript 最后更新 2018-03-05 01:05 558 浏览

如果我有一个JavaScript对象,说

var myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
有没有一种内置的或被接受的最佳实践方式来获得这个对象的长度?
已邀请:

nfugit

赞同来自:

我不是一个JavaScript专家,但它看起来像你将不得不遍历元素并对它们进行计数,因为Object没有长度方法:

var element_count = 0;
for (e in myArray) {  if (myArray.hasOwnProperty(e)) element_count++; }
@palmsey:为了公平性,JavaScript文档实际上明确提到使用Object类型的变量作为“关联数组”。

dodit

赞同来自:

以下是如何以及不要忘记检查该属性是否在原型链上:

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

veos

赞同来自:

@palmsey: In fairness to the OP, the javascript docs actually explicitly refer to using variables of type Object in this manner as "associative arrays".
公平地说,@palmsey他非常正确,他们不是关联数组,他们绝对是对象:) - 完成关联数组的工作。但关于更广泛的观点,根据我发现的这篇相当精美的文章,你肯定有权利: JavaScript “Associative Arrays” Considered Harmful 但是根据所有这些,accepted answer本身不好的做法是不是?
Specify a prototype size() function for Object
如果任何其他内容已添加到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方法,并在遍历它们时检查成员的类型。

funde

赞同来自:

最强大的答案(即捕捉你想要做的事情的意图,同时导致最少的错误)将是:

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
var size = Object.size(myArray);
JavaScript中有一种约定don't add things to Object.prototype,因为它可能会破坏各种库中的枚举。不过,向Object添加方法通常是安全的。
这是2016年和widespread deployment of ES5及以后的更新。对于IE9 +和所有其他现代ES5 +浏览器,您可以使用Object.keys(),以便上面的代码变为:
var size = Object.keys(myObj).length;
由于现在内置了Object.keys(),因此不需要修改任何现有的原型。

vanimi

赞同来自:

如果你知道你不必担心hasOwnProperty检查,你可以简单地做到这一点:

Object.keys(myArray).length

xid

赞同来自:

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

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属性将是正确的。如果您担心自己或其他人忘记使用它,则可以将其他人发布的属性计数器添加到长度方法中。 当然,你总是可以覆盖这些方法。但即使你这样做,你的代码可能会失败,使调试变得容易。 ;)

ysunt

赞同来自:

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

zomnis

赞同来自:

那样的事情呢 -

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

dab

赞同来自:

以上的一些变化是:

var objLength = function(obj){    
    var key,len=0;
    for(key in obj){
        len += Number( obj.hasOwnProperty(key) );
    }
    return len;
};
整合hasOwnProp是一种更优雅的方式。

lvero

赞同来自:

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

vfugit

赞同来自:

下面是James Coglan在CoffeeScript中为那些已经放弃JavaScript的人的回答的一个版本:)

Object.size = (obj) ->
  size = 0
  size++ for own key of obj
  size

guozao

赞同来自:

这是James Cogan的答案的另一个版本。不要传递参数,只需创建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/

det

赞同来自:

这是一个完全不同的解决方案,只能在更现代的浏览器(IE9 +,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);

xid

赞同来自:

这是最多的跨浏览器解决方案。 这比接受的答案要好,因为如果存在,它使用本机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;

dmodi

赞同来自:

如果我们有散列

hash = {"a" : "b", "c": "d"};
我们可以使用密钥长度来得到长度:
keys(hash).length

xeos

赞同来自:

像大多数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());

bsit

赞同来自:

如果您使用的是jQuery,只需使用对象的.length方法即可。 $(object).length会为您提供传递对象的长度。 UPDATE :在对象的情况下,这将始终返回1但是适用于jQuery元素。

uculpa

赞同来自:

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

Object.getOwnPropertyNames({"hi":"Hi","msg":"Message"}).length; // => 2

lnulla

赞同来自:

使用如下简单的内容:

Object.keys(obj).length
它不一定非常困难,绝对不需要其他功能来完成。

oad

赞同来自:

属性
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

overo

赞同来自:

简单的解决方案:

  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.

aet

赞同来自:

如果您正在使用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>

quo_et

赞同来自:

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

guozao

赞同来自:

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

  1. 运行Object.keys()以获取仅包含enumerableObject.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
演示请参阅this Fiddle

xsed

赞同来自:

如果您需要公开其大小的关联数据结构,最好使用地图而不是对象。

var myMap = new Map();
myMap.set("firstname", "Gareth");
myMap.set("lastname", "Simpson");
myMap.set("age", 21);
myMap.size; // 3

set

赞同来自:

使用:

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

uid

赞同来自:

该解决方案适用于多种情况并跨浏览器: 的代码

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

vvel

赞同来自:

你可以简单地在任何对象上使用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()

adolor

赞同来自:

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

Object.values(myObject).length

csequi

赞同来自:

有点迟到的游戏,但一个很好的方式来实现这一点(仅限IE9 +)是在长度属性上定义一个神奇的getter:

Object.defineProperty(Object.prototype, "length", {
    get: function () {
        return Object.keys(this).length;
    }
});
你可以像这样使用它:
var myObj = { 'key': 'value' };
myObj.length;
会给1