70

我有一个 JavaScript 关联数组(或者有些人可能更喜欢称它为对象),比如

var quesArr = new Array();
quesArr["q101"] = "Your name?";
quesArr["q102"] = "Your age?";
quesArr["q103"] = "Your school?";

是否有可以获取该数组长度的内置函数,或者 jQuery 或其他库中的解决方案?目前 quesArr.length 会给出 0,因为你们中的大多数人一定都知道。

请不要建议迭代这个问题中提到的整个数组/对象,因为我拥有的数组/对象非常大。

有没有办法我可以继续这个?

4

4 回答 4

156

不,没有内置属性可以告诉您该对象有多少属性(这是您要查找的)。

我能想到的最接近的是两个 ES5 和更高的特性,Object.keysspec | MDN)和Object.getOwnPropertyNamesspec | MDN)。例如,您可以这样使用Object.keys

console.log(Object.keys(quesArr).length); // "3"

Object.keys返回对象自己的可枚举字符串命名属性的名称数组。但是在内部(理论上)这是您不想使用的循环(当然,在 ES5 之前的环境中,它的 polyfill 使用了循环)。如果您还想要不可枚举的字符串命名属性,则可以Object.getOwnPropertyNames改用。

在 ES2015+ 中,对象可以具有键是符号而不是字符串的属性。Object.getOwnPropertySymbols( spec | MDN ) 让你得到它们。


FWIW,除非您要使用Array对象的功能,否则不要将其设为数组。反而:

var quesArr = {};
quesArr["q101"] = "Your name?";
quesArr["q102"] = "Your age?";
quesArr["q103"] = "Your school?";

如果您不希望它们是(无论您使用数组还是普通对象),这些键也不必作为方括号中的字符串文字给出:

var quesArr = {};
quesArr.q101 = "Your name?";
quesArr.q102 = "Your age?";
quesArr.q103 = "Your school?";

但是,如果您愿意,可以使用其他表示法;它们是完全等价的,除了用点表示法,键必须是有效的标识符名称(在括号表示法中,它们可以是任何东西)。

你甚至可以这样做:

var quesArr = {
    q101: "Your name?",
    q102: "Your age?",
    q103: "Your school?"
};

或(如果键不是有效的标识符):

var quesArr = {
    "q101": "Your name?",
    "q102": "Your age?",
    "q103": "Your school?"
};

这些可以是单引号或双引号。

于 2012-05-12T11:24:00.130 回答
13

假设您有以下内容,

var myObject = {};  // Denotes an Object is being created
myObject.city = "Chennai";
myObject.state = "Tamilnadu";
myObject.country = "Indian Peninsula";
console.log(myObject.length);  // Results in undefined

但是,有一种方法可以在现代浏览器(Chrome、Firefox 4+ 和 Internet Explorer 9)中计算长度:

Object.keys(myObject);
// --> ["city", "state", "country"]
Object.keys(myObject).length
// --> 3
于 2014-11-25T06:32:47.523 回答
1

还可以通过使用称为length的关联元素跟踪数组的长度来处理关联数组长度问题。

众所周知

myArray["length"] = 0;

当您添加或删除元素时,只需从元素中添加或减去myArray["length"]

然后您可以执行以下操作:

theLength = myArray.length;
于 2013-04-08T06:28:30.057 回答
0

关联数组没有长度属性,但您可以获得长度

于 2017-02-12T11:15:39.953 回答