如果我有一个JavaScript对象,比如说
var myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
是否有内置或接受的最佳实践方法来获取此对象的长度?
如果我有一个JavaScript对象,比如说
var myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
是否有内置或接受的最佳实践方法来获取此对象的长度?
最强大的答案(即捕获您尝试做的意图同时导致最少的错误)将是:
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
var size = Object.size(myArray);
你有一种JavaScript惯例 不要向Object.prototype添加内容,因为它可以破坏各种库中的枚举。但是,向Object添加方法通常是安全的。
这是2016年和2016年的更新 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,
"occupation": "Programmer"
};
const propOwn = Object.getOwnPropertyNames(person);
console.log(propOwn.length); // 1
let propSymb = Object.getOwnPropertySymbols(person);
console.log(propSymb.length); // 2
如果你知道你不必担心 hasOwnProperty
检查,你可以非常简单地做到这一点:
Object.keys(myArray).length
更新:如果你正在使用 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;
};
使用简单的东西:
Object.keys(obj).length
它并不困难,绝对不需要另外的功能来完成。
这是最跨浏览器的解决方案。
这比接受的答案更好,因为它使用本机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;
我不是JavaScript专家,但看起来你必须遍历元素并计算它们,因为Object没有length方法:
var element_count = 0;
for (e in myArray) { if (myArray.hasOwnProperty(e)) element_count++; }
@palmsey:为了公平对待OP,JavaScript文档实际上明确地将这种类型的Object类型的变量称为“关联数组”。
此方法在数组中获取所有对象的属性名称,因此您可以获得该数组的长度,该长度等于对象的键的长度。
Object.getOwnPropertyNames({"hi":"Hi","msg":"Message"}).length; // => 2
为了不弄乱原型或其他代码,您可以构建和扩展自己的对象:
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属性将是正确的。如果您担心您或其他人忘记使用它,您也可以添加其他人发布的属性计数器到长度方法。
当然,您总是可以覆盖这些方法。但即使你这样做,你的代码可能会明显失败,使其易于调试。 ;)