在ActionScript 3.0中,如何找到关联数组的长度?

10
有没有一种简单的方法来检索使用ActionScript 3.0实现的关联数组(实现为Object)的长度?
我了解在AS3中创建关联数组有两种主要方式:
1.使用Dictionary对象;当键不需要是string时特别方便
2.使用Object,并为每个所需元素创建属性。属性名称是键,值就是值。
我的应用程序使用第二种方法(使用Object类表示关联数组)。
我希望有比我手动计算所有元素的for循环更本地化的方法。
4个回答

9

我没有给你的链接点踩,但它已经失效了。对于未来的用户,请查看这个链接以获取对象的长度:http://www.grindheadgames.com/get-the-length-of-an-object - Dave Chen

5

在进行一些测试后,我实际上感到惊讶了。这是一个数组的常规用法:

var things:Array = [];
things.push("hi!");
trace(things.length);
// traces 1
trace(things);
// traces hi!

如果我们将一个值设置为字符串:

var things:Array = [];
things["thing"] = "hi!";
trace(things.length);
// traces 0
trace(things);
// traces an empty string
trace(things["thing"]);
// traces hi!

基本上,如果您使用字符串添加内容,则设置的是属性而不是实际添加到数组中。这让我想知道为什么Array以这种方式是动态的。
所以... 是的,可以使用for ... in循环计算项目数!

很奇怪!你认为数组在内部被重新转换为对象了吗? - defmeta
虽然所有东西都扩展自对象(动态的),但有些类是动态的,有些是静态的。但为什么数组是动态的? - Iain
虽然可行,但这是不被赞同的。从API中可以看到:“不要使用Array类来创建关联数组...要创建关联数组,请使用Object类。” - Aupajo

4

我认为你只能“手动”计数。

一个选项是将整个内容包装在一个类中,并保留一个单独的变量,随着添加/删除而更新。


3
var count:int; 
var key:String; 

for (key in myObject)
{ 
    count++; 
} 

trace ("myObject has this many keys in it: " + count);

或者,作为替代方案,使用for-each语法(我没有测试过哪个更快)。
for each (var o:* in myObject)
{
    count++;
}

我敢打赌第一个更快,但差别微不足道。 - Dan Rosenstark

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