JavaScript 对象的长度

问:

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

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

答1:

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

更新的答案

这是 2016 年和 widespread deployment of ES5 及以后的更新。 对于 IE9+ 和所有其他支持 ES5+ 的现代浏览器,您可以使用 Object.keys(),因此上述代码变为:

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

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

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

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

Object.keys 或 Object.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

答2:

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com

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

Object.keys(myArray).length

为什么不?据我所知,这是一个标准:developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…

它不是一种普遍实现的方法,但您可以使用 this table 检查哪个浏览器支持它。

是时候切换到 Firefox = 不幸的是,您切换并不意味着您网站的用户会...

@ripper234 不支持 IE = 填充时间

@ripper234 关心 IE,没有人应该关心 IE 不标准,只关心标准。用户想使用 IE,那么他们将不会浏览我的网站,我不再关心。开发人员不应该填充不是由即“开发人员”制定的标准

答3:

打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!

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

答4:

huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。

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

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

答5:

huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。

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

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

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

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

答6:

huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。

只需使用它来获取 length:

Object.keys(myObject).length

请说明您的回答与stackoverflow.com/a/6700/8632727有何不同

很好,最好根据变量的实际名称来命名变量。使您的代码对其他开发人员更具可读性。

在“myArray”->“myObject”编辑之前,这与第二高投票的答案相同。

与过去的反应相同。

答7:

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com

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

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

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

答8:

huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。

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

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”循环,如果数组很大,这可能会很昂贵

答9:

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com

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

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

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

答10:

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

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

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

答11:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

这是一个完全不同的解决方案,仅适用于更现代的浏览器(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 很可能会产生不希望的结果。

原文链接:https://www.huntsbot.com/qa/Zv39/length-of-a-javascript-object?lang=zh_CN&from=csdn

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值