ChatGPT解决这个技术问题 Extra ChatGPT

JavaScript 对象的长度

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

const myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
@neitony - 确实如此,但是很多人习惯了 PHP 的“关联数组”,以至于他们可能认为这意味着“有序关联映射”,而 JS 对象实际上是无序的。
在上面的例子中,myObject.length 是未定义的,至少在浏览器环境中是这样。这就是它无效的原因,@AdrianM
Object.{keysvaluesentries}(obj).length 的变体现在已在 16 个答案以及此问题的评论中被提及共 38 次,在 7 个已删除答案中又被提及 11 次。我认为现在已经足够了。

m
mikemaccana

更新的答案

这是 2016 年和 widespread deployment of 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, "职业": "程序员" }; const propOwn = Object.getOwnPropertyNames(person);控制台.log(propOwn.length); // 1 let propSymb = Object.getOwnPropertySymbols(person);控制台.log(propSymb.length); // 2

较旧的答案

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

Object.size = function(obj) { var size = 0, key; for (key in obj) { if (obj.hasOwnProperty(key)) size++; } 返回大小; }; // 获取对象的大小 const myObj = {} var size = Object.size(myObj);

在 JavaScript 中有一种您don't add things to Object.prototype的约定,因为它会破坏各种库中的枚举。不过,向 Object 添加方法通常是安全的。


@Tres - 如果有人在不知道您已经在代码中某处声明它的情况下覆盖“大小”属性,则您的代码可能会被破坏,因此始终值得检查它是否已经定义
@vsync 你说的很对。应该始终实施必要的健全性检查:)
为什么每个人都忽略了这一点:Object.keys(obj).length
@MuhammadUmer 可能是因为编写此答案时甚至不存在该方法。即使在今天,使用它也可能需要旧浏览器的 polyfill。
@stonyau IE8、IE9、IE10 是没有得到微软支持的死浏览器。 IE8、IE9、IE10 用户收到来自 Microsoft 的通知,他们使用旧的、不受支持的浏览器,并且应该期望这些东西对他们不起作用。 support.microsoft.com/en-us/kb/3123303
J
Jeromy French

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

Object.keys(myArray).length

为什么不?据我所知,这是一个标准:developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
它不是一种普遍实现的方法,但您可以使用 this table 检查哪个浏览器支持它。
是时候切换到 Firefox = 不幸的是,您切换并不意味着您网站的用户会...
@ripper234 不支持 IE = 填充时间
@ripper234 关心 IE,没有人应该关心 IE 不标准,只关心标准。用户想使用 IE,那么他们将不会浏览我的网站,我不再关心。开发人员不应该填充不是由即“开发人员”制定的标准
r
ripper234

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

_.size() 是我的 Meteor 项目的完美解决方案,它支持 underscore.js。
我使用下划线,而这篇文章只是提醒我,我在这个项目中使用的不够多。如果你处理对象,你应该有 underscore.js 可用。
下划线 > (all -['lo-dash'])
underscorejs,应该在 js 下的东西 :)
@Babydead 区分对象的真实属性与继承的属性。 developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
J
Joon

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

这比接受的答案更好,因为它使用本机 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;

Object.keys() 返回一个数组,其中仅包含那些可枚举的属性的名称。如果你想要一个包含所有属性的数组,你应该使用 Object.getOwnPropertyNames() 代替。请参阅developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
P
Peter Mortensen

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

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

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


不起作用,因为它也会计算通过原型添加的方法。
B
Barry Michael Doyle

只需使用它来获取 length

Object.keys(myObject).length

请说明您的回答与stackoverflow.com/a/6700/8632727有何不同
很好,最好根据变量的实际名称来命名变量。使您的代码对其他开发人员更具可读性。
在“myArray”->“myObject”编辑之前,这与第二高投票的答案相同。
与过去的反应相同。
P
Patrick Roberts

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

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

@PatrickRoberts 键方法不会从原型链返回属性。那么这里为什么需要 hasOwnProperty。 getOwnProperty 也将返回隐藏属性,因为长度在数组等中。
P
Pang

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

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

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


我认为这是最好的解决方案,因为它不需要使用“for”循环,如果数组很大,这可能会很昂贵
c
costaparas

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

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


从理论上讲,如果您有长值,他会比“键”方法慢,因为它直接访问值然后计算它们。
K
Kev

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

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

P
Peter Mortensen

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

请参阅this 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);

我认为这并不安全。例如它不能有一个键为“length”的元素,语句 a1["length"] = "Hello world";无法存储条目。还有语句 a1["hasOwnProperty"] = "some prop";完全破坏了功能
@PanosTheof 如果您使用 length 属性,我认为您不希望它存储该值,任何使用它的代码都必须确保它不会尝试存储 length,但我想这会如果它也是标准数组,则相同。在任何对象上覆盖 hasOwnProperty 很可能会产生不希望的结果。
P
Peter Mortensen

利用:

var myArray = new Object(); myArray["firstname"] = "Gareth"; myArray["lastname"] = "辛普森";我的数组[“年龄”] = 21; obj = Object.keys(myArray).length;控制台日志(obj)


R
RAGINROSE

myObj中的keys个数为:

这对我有用:

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

k
kabirbaidhya

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

const myMap = new Map(); myMap.set("名字", "Gareth"); myMap.set("姓氏", "辛普森"); myMap.set("年龄", 21);控制台.log(myMap.size); // 3


d
double-beep

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

var myObject = new Object(); myObject["firstname"] = "Gareth"; myObject["lastname"] = "辛普森";我的对象[“年龄”] = 21; console.log(Object.keys(myObject).length); //3


J
Jānis Elmeris

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


P
Peter Mortensen

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

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

JavaScript “Associative Arrays” Considered Harmful

但根据这一切,the accepted answer 本身是不好的做法?

为 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 方法,并在遍历成员时检查成员的类型。


P
Peter Mortensen

最简单的方法是这样的:

Object.keys(myobject).length

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


这似乎只是 this existing answer 的重复。
@Pang 同意,它没有像其他答案那样提供任何进一步的上下文。
P
Peter Mortensen

如果我们有哈希

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

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

键(哈希).length


这是一个很好的答案,但是我找不到此键功能的任何文档。所以我不能对跨浏览器支持有信心。
不幸的是,这并不是我最初想的那么好的答案!事实证明,keys 功能仅在 chrome 和 firefox web 控制台中可用。如果您将此代码放入脚本中,那么它将失败并出现 Uncaught ReferenceError: keys is not defined
这与 aeosynth's answer 有何不同?
J
Jerry

这样的事情怎么办——

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

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

Object.values(myObject).length Object.entries(myObject).length Object.keys(myObject).length


以上 3 个中哪一个更快。
Object.values(myObject).length
我们怎么能说它 Object.values(myObject).length 更快有没有例子谢谢,@tdjprog
只需在控制台中尝试:var myObject = {}; for (let i=0; i<10000000; i++) myObject[i] = i;
为什么 Object.values(myObject).length 更快,而 Object.entries(myObject).length 即使在某个时间之后也没有给出输出,这是什么原因?谢谢@tdjprog
P
Peter Mortensen

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

OP 没有要求 AngularJS 版本。这不是问题的有效答案。
S
Soura Ghosh
const myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;

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

// o/p 3

“o/p 3”是什么意思?
对这个答案的解释是有序的。
此外,它与以前的答案(例如 shaheb's answer)有何不同?
@PeterMortensen “o/p” 可能意味着“输出”。
o/p 表示输出
P
Peter Mortensen

上述某些内容的变体是:

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

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


J
John Slegers

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

运行 Object.keys() 以获取仅包含可枚举属性名称的数组,或者如果您还想包含不可枚举属性的名称,则运行 Object.getOwnPropertyNames()。获取该数组的 .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 以获取演示。


S
Sherzod

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


Object.prototype - 坏主意。
@tborychowski 你能解释一下为什么吗?
这是一篇文章:bit.ly/1droWrG。我并不是说不能这样做,只是说在你这样做之前你需要知道所有的后果。
如果您要扩展内置原型或填充属性(即猴子补丁),请正确执行:为了向前兼容,请先检查属性是否存在,然后使属性不可枚举,以便自己的键的构造对象没有被污染。对于方法,请使用 actual methods。我的建议:遵循 these examples,它演示了如何添加一个行为尽可能类似于内置方法的方法。
P
Pian0_M4n

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


Object.keys() 返回一个数组,其中仅包含那些可枚举的属性的名称。如果你想要一个包含所有属性的数组,你应该使用 Object.getOwnPropertyNames() 代替。请参阅developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
这与 aeosynth's answer 有何不同?
M
Mystical

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

函数 objLength(obj) { 返回 Object.keys(obj).length; } console.log(objLength({a:1, b:"summit", c:"废话"})); // 工作得很好 var obj = new Object(); obj['鱼'] = 30; obj['无效内容'] = null; console.log(objLength(obj)); // 它也可以按照你的方式工作,即使用 Object 构造函数 Object.prototype.getLength = function() { return Object.keys(this).length; } console.log(obj.getLength()); // 你也可以把它写成一个方法,这样效率更高 Object.defineProperty(Object.prototype, "length", {get:function(){ return Object.keys(this).length; }} );控制台.log(obj.length); // 可能最有效的方法是这样做并在上面演示,它为返回 getLength(this) 或 this.getLength() 的等效值的对象设置一个名为“length”的 getter 属性


这与 aeosynth's answer 有何不同?
这是因为它展示了如何将其作为函数和全局对象方法(更面向对象并使用某种形式的封装);但是 aeosynth's answer 没有。
如果您要扩展内置原型或填充属性(即猴子补丁),请正确执行:为了向前兼容,请先检查属性是否存在,然后使属性不可枚举,以便自己的键的构造对象没有被污染。对于方法,请使用 actual methods。我的建议:遵循 these examples,它演示了如何添加一个行为尽可能类似于内置方法的方法。
此外,编写方法如何“更有效”?
R
Ran Turner

使用 Object.entries 方法获取长度是实现它的一种方法

常量 objectLength = obj => Object.entries(obj).length; const person = { id: 1, name: 'John', age: 30 } const car = { type: 2, color: 'red', } console.log(objectLength(person)); // 3 console.log(objectLength(car)); // 2


P
Peter Mortensen

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

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

你可以像这样使用它:

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

它会给1


除了反对原型修改的争论之外,我个人从未遇到过由它引起的错误,对我来说这是 JavaScript 的强项之一。