JavaScript 对象的长度

IT技术 javascript javascript-objects
2021-01-28 19:52:56

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

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

更新答案

这是 2016 年的更新以及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,
  "occupation": "Programmer"
};

const propOwn = Object.getOwnPropertyNames(person);
console.log(propOwn.length); // 1

let propSymb = Object.getOwnPropertySymbols(person);
console.log(propSymb.length); // 2

较旧的答案

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

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
const myObj = {}
var size = Object.size(myObj);

JavaScript 中有一种约定,您不要向 Object.prototype 添加内容,因为它会破坏各种库中的枚举。不过,向 Object 添加方法通常是安全的。


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

如果您知道不必担心hasOwnProperty检查,您可以这样使用Object.keys()方法:

Object.keys(myArray).length
这不是一种普遍实现的方法,但您可以使用此表检查哪个浏览器支持它
2021-03-10 19:52:56
@ripper234 关心 IE,没有人应该关心 IE 的非标准,只关心标准。用户想要使用 IE,然后他们将不会浏览我的网站,我不再关心。开发人员不应 polyfill 不是由“开发人员”制定的标准
2021-03-10 19:52:56
是时候切换到 firefox = 不幸的是,您切换并不意味着您网站的用户会...
2021-03-19 19:52:56
@ripper234 没有 IE 支持 = 需要 polyfill
2021-03-29 19:52:56
为什么不?据我所知,这是一个标准:developer.mozilla.org/en/JavaScript/Reference/Global_Objects/...
2021-04-08 19:52:56

更新:如果你使用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;
};
我使用下划线,这篇文章只是提醒我,我在这个项目中使用它的次数不够多。如果你处理对象,你应该有 underscore.js 可用。
2021-03-15 19:52:56
@Babydead 区分对象的真实属性与继承的属性。developer.mozilla.org/en/docs/Web/JavaScript/Reference/...
2021-03-15 19:52:56
下划线 > (all -['lo-dash'])
2021-03-16 19:52:56
_.size()是我的Meteor项目的完美解决方案,它支持 underscore.js。
2021-03-17 19:52:56
underscorejs,应该在js下的东西:)
2021-03-17 19:52:56

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

这比接受的答案要好,因为它使用本机 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/...
2021-03-22 19:52:56

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

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

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

不会工作,因为它也会计算通过原型添加的方法。
2021-03-23 19:52:56