问:
我有一个 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提供了这个机会