JavaScript关联数组的长度问题

77

我有一个JavaScript关联数组(或者有些人喜欢称之为对象),例如:

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

有没有内置函数可以获取这个数组的长度,或者在jQuery或其他库中提供的解决方案?当前quesArr.length将返回0,正如您大多数人所知道的那样。

请不要像这个问题中提到的那样遍历整个数组/对象,因为我拥有的数组/对象非常大。

有没有办法处理这个问题?


我建议您遍历整个对象,因为这是实现此目的的唯一方法。您拥有的是一个对象(在第二行之前是一个数组)。对象没有长度,而数组有。 - Fabien Ménager
2
可能是[JavaScript对象的长度(即关联数组)]的重复问题(https://dev59.com/QXVD5IYBdhLWcg3wWaVh)。 - Malvineous
4个回答

165

不,没有内置属性可以告诉您对象有多少属性(这就是您要查找的内容)。我能想到的最接近普通对象的是返回属性键数组的东西(继续阅读以获取替代方案),您可以从中获取length

  • Object.keys - 返回一个数组,其中包含对象的自有可枚举、以字符串为键的属性。
  • Object.getOwnPropertyNames - 类似于Object.keys,但也包括不可枚举的属性。
  • Object.getOwnPropertySymbols - 类似于Object.getOwnPropertyNames,但是针对符号键属性而不是字符串键属性。
  • Reflect.ownKeys - 返回一个数组,其中包含对象的自有属性(无论它们是否可枚举,以及它们是由字符串还是符号键控制)。
例如,您可以像这样使用Reflect.ownKeys

var quesArr = new Array(); // Keep reading, don't do this
quesArr["q101"] = "Your name?";
quesArr["q102"] = "Your age?";
quesArr["q103"] = "Your school?";
console.log(Reflect.ownKeys(quesArr).length); // 4 -- includes the built-in
                                              // `length` property!

请注意,显示的是4而不是3,这是因为数组具有内置的length属性。由于您似乎没有使用对象的Array功能,请不要将其作为数组处理。您可以将其设置为普通对象:

const questions = {};
questions["q101"] = "Your name?";
questions["q102"] = "Your age?";
questions["q103"] = "Your school?";
// Or just:
// const questions = {
//    q101: "Your name?",
//    q102: "Your age?",
//    q103: "Your school?",
// };
console.log(Reflect.ownKeys(questions).length); // 3

但是既然你想知道它里面有多少东西,你可以考虑使用Map,因为与对象不同,Map实例确实有一个属性告诉你它们里面有多少条目:size

const questions = new Map();
questions.set("q101", "Your name?");
questions.set("q102", "Your age?");
questions.set("q103", "Your school?");
// Or you can pre-fill the `Map` by passing an array of `[name, value]` arrays:
// const questions = new Map([
//     ["q101", "Your name?"],
//     ["q102", "Your age?"],
//     ["q103", "Your school?"],
// ]);
console.log(questions.size); // 3


1
好的,这对我来说是一些新信息。同时我看到没有办法在不迭代对象的情况下知道它的长度。无论如何谢谢。 :) - gopi1410
4
顺便说一下,如果你发现自己在写 new Array(),可以改用 [] 代替。[] 创建一个新的、空白的数组,就像 {} 创建一个新的、空白的对象一样。 - T.J. Crowder
1
由于您在20分钟前编辑了答案:实际上已经不是2012年了,“替代”部分可能更适合以Map.size(https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Map/size)作为结尾。 - tevemadar
1
由于您在20分钟前编辑了答案:现在已经不是2012年了,而是部分可以更好地以Map.size作为高潮。 - tevemadar
@tevemadar - 哈哈,我刚刚看到了对答案的投票,发现它没有 ownKeys,然后只是修复了这个问题--我甚至没有读完整个答案。就像你说的:Map!! 我现在已经彻底改进了整个东西。正如你所说,11年过去了,事情已经发生了变化。 - T.J. Crowder

15

假设你有以下内容:

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

0

你可以通过使用名为 length 的关联元素来跟踪数组的长度,从而解决关联数组长度问题。

也称为:

myArray["length"] = 0;

当您添加或删除元素时,只需从myArray["length"]元素中添加或减去即可。
然后,您可以执行以下操作:
theLength = myArray.length;

在OP的情况下,他们的数组是一个实际的数组,而不是一个简单的对象,因此它已经有了.length属性。所以如果他们做了任何“适当”的数组操作(例如.push()),那么长度就会改变... - nnnnnn

-1

1
请不要将您的答案以图像形式发布 - 我们的防火墙会阻止imgur。 - Andrew Smith
本质上,这简化为TJ在半个十年之前在他的答案中包含的相同代码。您只是用几乎不可读的JPEG表达了所有的代码,并没有解释它。 - Quentin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接