我有一个JavaScript对象。是否有一种内置或公认的最佳实践方法来获取此对象的长度?
const myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
我有一个JavaScript对象。是否有一种内置或公认的最佳实践方法来获取此对象的长度?
const myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
当前回答
更新的答案
以下是截至2016年的最新情况,以及ES5及更高版本的广泛部署。对于IE9+和所有其他支持ES5+的现代浏览器,您可以使用Object.keys(),因此上面的代码变成:
var size = Object.keys(myObj).length;
这不需要修改任何现有的原型,因为Object.keys()现在是内置的。
编辑:对象可以具有无法通过Object.key方法返回的符号财产。因此,如果不提及它们,答案将是不完整的。
将符号类型添加到语言中,以创建对象财产的唯一标识符。符号类型的主要优点是防止覆盖。
Object.keys或Object.getOwnPropertyNames不适用于符号财产。要返回它们,需要使用Object.getOwnPropertySymbols。
var人={[符号('name')]:'John Doe',[符号('age')]:33,“职业”:“程序员”};const propOwn=对象.getOwnPropertyNames(个人);console.log(propOwn.length);//1.let propSymb=对象.getOwnPropertySymbol(人);console.log(propSymb.length);//2.
较旧的答案
最可靠的答案(即,在导致最少错误的情况下,捕捉到您试图做的事情的意图)是:
Object.size=函数(obj){var大小=0,钥匙for(在obj中键入){if(obj.hasOwnProperty(key))大小++;}收益大小;};//获取对象的大小常量myObj={}var size=对象大小(myObj);
JavaScript中有一种约定,即不向Object.prototype中添加内容,因为它可以打破各种库中的枚举。不过,向Object添加方法通常是安全的。
其他回答
这是最跨浏览器的解决方案。
这比接受的答案更好,因为它使用本机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类原型化并使代码更干净。
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.keys(obj).length来获取其长度。keys返回一个包含所有对象键(财产)的数组,使用相应数组的长度可以方便地找到该对象的长度。你甚至可以为此编写一个函数。让我们发挥创意,并为其编写一个方法(以及更方便的getter属性):
函数objLength(obj){return Object.keys(obj).length;}console.log(objLength({a:1,b:“summit”,c:“无意义”}));//工作非常好var obj=新对象();obj['fish']=30;obj['ullified content']=null;console.log(objLength(obj));//它也按照您的方式工作,即使用Object构造函数创建它Object.prototype.getLength=函数(){return Object.keys(this).length;}console.log(obj.getLength());//你也可以把它写成一个方法,这样做效率更高Object.defineProperty(Object.prototype,“length”,{get:function(){return Object.keys(this).length;}});console.log(对象长度);//可能最有效的方法是这样做的,并在上面进行了演示,它为对象设置了一个名为“length”的getter属性,该属性返回getLength(this)或this.getLength()的等效值
此方法在数组中获取对象的所有属性名称,因此可以获得该数组的长度,该长度等于对象的键的长度。
Object.getOwnPropertyNames({"hi":"Hi","msg":"Message"}).length; // => 2
像这样的怎么样--
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--; }}
}