计算对象的键/财产数的最快方法是什么?是否可以在不迭代对象的情况下执行此操作?即,不做:
var count = 0;
for (k in myobj) if (myobj.hasOwnProperty(k)) ++count;
(Firefox确实提供了一个神奇的__count__属性,但在版本4左右,这个属性被删除了。)
计算对象的键/财产数的最快方法是什么?是否可以在不迭代对象的情况下执行此操作?即,不做:
var count = 0;
for (k in myobj) if (myobj.hasOwnProperty(k)) ++count;
(Firefox确实提供了一个神奇的__count__属性,但在版本4左右,这个属性被删除了。)
当前回答
这对数组和对象都有效
//count objects/arrays
function count(obj){
return Object.keys(obj).length
}
使用循环计数对象/数组
function count(obj){
var x=0;
for(k in obj){
x++;
}
return x;
}
计数对象/数组以及字符串的长度
function count(obj){
if (typeof (obj) === 'string' || obj instanceof String)
{
return obj.toString().length;
}
return Object.keys(obj).length
}
其他回答
我解决这个问题的方法是构建我自己的基本列表实现,该列表记录对象中存储了多少项。这很简单。类似于:
function BasicList()
{
var items = {};
this.count = 0;
this.add = function(index, item)
{
items[index] = item;
this.count++;
}
this.remove = function (index)
{
delete items[index];
this.count--;
}
this.get = function(index)
{
if (undefined === index)
return items;
else
return items[index];
}
}
您可以使用以下代码:
if (!Object.keys) {
Object.keys = function (obj) {
var keys = [],
k;
for (k in obj) {
if (Object.prototype.hasOwnProperty.call(obj, k)) {
keys.push(k);
}
}
return keys;
};
}
然后,您也可以在较旧的浏览器中使用此功能:
var len = Object.keys(obj).length;
这对数组和对象都有效
//count objects/arrays
function count(obj){
return Object.keys(obj).length
}
使用循环计数对象/数组
function count(obj){
var x=0;
for(k in obj){
x++;
}
return x;
}
计数对象/数组以及字符串的长度
function count(obj){
if (typeof (obj) === 'string' || obj instanceof String)
{
return obj.toString().length;
}
return Object.keys(obj).length
}
如前一个答案中所回答的:Object.keys(obj).length
但是:因为我们现在在ES6中有一个真正的Map类,所以我建议使用它,而不是使用对象的财产。
const map = new Map();
map.set("key", "value");
map.size; // THE fastest way
以下是三种方法的一些性能测试;
https://jsperf.com/get-the-number-of-keys-in-an-object
对象.keys().length
每秒20735次操作
它非常简单和兼容,运行速度快但成本高昂,因为它创建了一个新的密钥数组,然后将其丢弃。
return Object.keys(objectToRead).length;
循环键
每秒15734次操作
let size=0;
for(let k in objectToRead) {
size++
}
return size;
它稍微慢一点,但与内存使用量相差甚远,因此如果您对移动或其他小型机器的优化感兴趣,它可能会更好。
使用贴图而不是对象
每秒953839338次操作
return mapToRead.size;
基本上,Map跟踪自己的大小,所以我们只返回一个数字字段。它比任何其他方法都快得多。如果可以控制对象,请将其转换为贴图。