我有一个JavaScript对象,是否有内置的或公认的最佳实践方法来获取此对象的长度?
const myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
Object.keys(obj).length
我有一个JavaScript对象,是否有内置的或公认的最佳实践方法来获取此对象的长度?
const myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
Object.keys(obj).length
Answers:
最可靠的答案(即,在引起最少的错误的同时,捕捉您要尝试做的事情的意图)将是:
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(myObj);
JavaScript中有一种约定,您不向Object.prototype添加内容,因为它可能会破坏各种库中的枚举。不过,向Object添加方法通常是安全的。
这是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
Object.keys(obj).length
如果您知道不必担心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;
};
_.size()
是我的Meteor项目的完美解决方案,该项目具有underscore.js支持。
这是最跨浏览器的解决方案。
这比接受的答案要好,因为它使用本机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()
返回一个数组,该数组仅包含那些可枚举的属性的名称。如果要使用具有ALL属性的数组,则应Object.getOwnPropertyNames()
改用。见developer.mozilla.org/en/docs/Web/JavaScript/Reference/...
我不是JavaScript专家,但是由于Object没有length方法,因此您似乎必须遍历元素并对其进行计数:
var element_count = 0;
for (e in myArray) { if (myArray.hasOwnProperty(e)) element_count++; }
@palmsey:为了公平起见,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属性将是正确的。如果您担心自己或其他人忘记使用它,则也可以将其他人发布的属性计数器添加到length方法中。
当然,您总是可以覆盖这些方法。但是,即使这样做,您的代码也可能会明显失败,从而易于调试。;)
只需使用它即可获得length
:
Object.keys(myObject).length
myArray
这是一个完全不同的解决方案,仅适用于更现代的浏览器(IE9 +,Chrome,Firefox 4 +,Opera 11.60 +,Safari 5.1+)
设置您的关联数组类
/**
* @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
属性,您不希望它存储值,使用该属性的任何代码都必须确保它不会尝试针对该属性进行存储length
,但是我猜想如果使用一个标准数组。覆盖hasOwnProperty
任何对象很可能会产生不希望的结果。
在某些情况下,最好将大小存储在单独的变量中。特别是,如果要在一处将一个元素添加到数组中,并且可以轻松地增加大小。如果您需要经常检查尺寸,显然可以更快地工作。
采用:
var myArray = new Object();
myArray["firstname"] = "Gareth";
myArray["lastname"] = "Simpson";
myArray["age"] = 21;
obj = Object.keys(myArray).length;
console.log(obj)
@palmsey:为了公平起见,JavaScript文档实际上以这种方式显式地将使用Object类型的变量称为“关联数组”。
为了公平起见,@ palmsey他是非常正确的,它们不是关联数组,它们绝对是对象:)-完成关联数组的工作。但是根据我发现的这篇相当不错的文章,关于更广泛的观点,您似乎绝对拥有它的权利:
但是根据所有这些,接受的答案本身不是不好的做法吗?
为对象指定原型size()函数
如果对象.prototype中添加了其他任何内容,则建议的代码将失败:
<script type="text/javascript">
Object.prototype.size = function () {
var len = this.length ? --this.length : -1;
for (var k in this)
len++;
return len;
}
Object.prototype.size2 = function () {
var len = this.length ? --this.length : -1;
for (var k in this)
len++;
return len;
}
var myArray = new Object();
myArray["firstname"] = "Gareth";
myArray["lastname"] = "Simpson";
myArray["age"] = 21;
alert("age is " + myArray["age"]);
alert("length is " + myArray.size());
</script>
我不认为答案应该是被接受的答案,因为如果您在同一执行上下文中运行任何其他代码,那么该答案就无法工作。要以健壮的方式执行此操作,您肯定需要在myArray中定义size方法,并在遍历成员时检查成员的类型。
如果我们有哈希
hash = {“ a”:“ b”,“ c”:“ d”};
我们可以使用键的长度(即哈希的长度)来获得长度:
keys(hash).length
var myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
var myObject = {}; for (let i=0; i<10000000; i++) myObject[i] = i;
如果您使用的是AngularJS 1.x,则可以通过创建过滤器并使用其他示例中的代码来执行AngularJS的操作,例如:
// Count the elements in an object
app.filter('lengthOfObject', function() {
return function( obj ) {
var size = 0, key;
for (key in obj) {
if (obj.hasOwnProperty(key)) size++;
}
return size;
}
})
用法
在您的控制器中:
$scope.filterResult = $filter('lengthOfObject')($scope.object)
或您认为:
<any ng-expression="object | lengthOfObject"></any>
如果您不关心支持Internet Explorer 8或更低版本,则可以通过执行以下两个步骤来轻松获取对象中的属性数:
Object.keys()
以获取仅包含那些可枚举属性名称的数组,或者Object.getOwnPropertyNames()
如果你想也包括不枚举的属性的名称。.length
数组的属性。如果您需要多次执行此操作,则可以将此逻辑包装在函数中:
function size(obj, enumerablesOnly) {
return enumerablesOnly === false ?
Object.getOwnPropertyNames(obj).length :
Object.keys(obj).length;
}
如何使用此特定功能:
var myObj = Object.create({}, {
getFoo: {},
setFoo: {}
});
myObj.Foo = 12;
var myArr = [1,2,5,4,8,15];
console.log(size(myObj)); // Output : 1
console.log(size(myObj, true)); // Output : 1
console.log(size(myObj, false)); // Output : 3
console.log(size(myArr)); // Output : 6
console.log(size(myArr, true)); // Output : 6
console.log(size(myArr, false)); // Output : 7
另请参阅此小提琴以获取演示。
这是詹姆斯·科根(James Cogan)答案的不同版本。无需传递参数,只需原型化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.prototype
- 馊主意。
您可以简单地Object.keys(obj).length
在任何对象上使用以获取其长度。Object.keys返回一个包含所有对象键(属性)的数组,可以使用相应的数组的长度来方便地找到该对象的长度。您甚至可以为此编写一个函数。让我们发挥创造力并为其编写一个方法(以及更方便的getter属性):
function objLength(obj)
{
return Object.keys(obj).length;
}
console.log(objLength({a:1, b:"summit", c:"nonsense"}));
// Works perfectly fine
var obj = new Object();
obj['fish'] = 30;
obj['nullified content'] = null;
console.log(objLength(obj));
// It also works your way, which is creating it using the Object constructor
Object.prototype.getLength = function() {
return Object.keys(this).length;
}
console.log(obj.getLength());
// You can also write it as a method, which is more efficient as done so above
Object.defineProperty(Object.prototype, "length", {get:function(){
return Object.keys(this).length;
}});
console.log(obj.length);
// probably the most effictive approach is done so and demonstrated above which sets a getter property called "length" for objects which returns the equivalent value of getLength(this) or this.getLength()
您始终Object.getOwnPropertyNames(myObject).length
可以得到与[].length
普通阵列相同的结果。
Object.keys()
返回一个数组,该数组仅包含那些可枚举的属性的名称。如果要使用具有ALL属性的数组,则应Object.getOwnPropertyNames()
改用。见developer.mozilla.org/en/docs/Web/JavaScript/Reference/...
我们可以使用以下方法找到对象的长度:
Object.values(myObject).length
游戏有点晚了,但是实现此目的的一种好方法(仅适用于IE9 +)是在length属性上定义一个魔术吸气剂:
Object.defineProperty(Object.prototype, "length", {
get: function () {
return Object.keys(this).length;
}
});
您可以像这样使用它:
var myObj = { 'key': 'value' };
myObj.length;
会给1
。
以下是James Coglan在CoffeeScript中针对那些已经放弃了JavaScript的人的答案:)
Object.size = (obj) ->
size = 0
size++ for own key of obj
size
size++ for own key of obj
(own key
在CoffeeScript中是语法糖)。使用hasOwnProperty
直接对象是危险的,因为它打破时,对象实际上具有这样的属性。