使用整数键创建一个关联数组。

3
我需要在JavaScript中创建一个带有整数键的关联数组,如下所示;
a["10"] = "ten";

但是当我创建一个数组时,它将值放在数组的第 10 个索引中,并创建长度为11的数组。我希望它成为一个键值对。我知道可以使用对象来实现这一点,但我只需要一个数组。


数组并不适合做这件事,那么你为什么需要一个数组呢?也许对象具有你正在寻找的功能,但你只是没有意识到。 - Cam
我正在使用JavaScript与SAPUI5项目,并且我需要在下拉菜单中填充数组,但是下拉菜单不支持对象。我只需要数组.. :( - Vishal Arora
2
Javascript数组是对象。 "索引"只是数字属性名称,长度属性被定义为最高索引加一,它不是索引的计数。 - RobG
2个回答

8

JavaScript没有关联数组。在JavaScript中,唯一的方法是使用对象:

var a = {
    '10': 'ten'
};

3
JavaScript确实有关联数组(也称作Map或者Dictionary),尽管是以一种有限的形式存在的(即对象),所有的键都会被强制转换为字符串。虽然这个术语感觉相当古老,但它是有效的,并且在一些语言中很常见,比如Perl(而在其他语言中,如PHP中则被滥用)。 - user166390
1
@Daksh - 不行。你能告诉我们为什么需要它成为一个数组吗?也许我们可以绕过那个问题。 - Joseph Silber
2
@Daksh - 在JavaScript中不存在稀疏/关联数组这样的东西。你可以有一个数组或一个对象,这是你的选择。你可能想要不同的东西,但它并不存在。 - jfriend00
1
@Cam 我不同意。这个答案以一个错误的陈述开始。(而且,它没有解释为什么在数组属性中使用"10"与使用10是相同的,所以没有什么可以抵消我的吹毛求疵。) - user166390
2
@jfriend00——我认为“稀疏”这个术语是可以的,并且被理解为一个数组,其中一些索引被省略,例如[0,1,,,4]或者是未定义的。 - RobG
显示剩余10条评论

2
ECMAScript确实有关联数组1 - 对象(以及间接地,数组)就是一个例子。
然而,某些数组属性会被特殊处理数组对象对一定类别的属性名进行特殊处理。当且仅当一个属性名P(以字符串形式表示)是一个数组索引时,若ToString(ToUint32(P))等于P,则该属性名P才是一个数组索引.. 具体来说,每次添加一个属性名为数组索引时,如果需要,长度属性将更改为该数组索引的数值加一..
因此,给定arr = [],表达式arr["1"]arr[1]引用同一个属性名称。由于P(属性名称)是“1”,并且上面的length为0,则对该属性的赋值将设置arr.lengthToUint32(P)+1,即2。
无法更改此行为。如果您希望具有特殊的length属性,则使用“普通”对象而不是数组。但是,许多Array.prototype函数可以与具有length属性的任意对象一起使用(除了一些实现怪癖),并且可以创建一个对象,使其使用Array.prototype作为自己的原型。
所有这些话说完了,这篇文章并没有说明真正的问题是什么。与其假设必须用那种特定的方式来做,不如解释一下意图:例如,为什么要使用 a["10"]?如果对象将用于列表,有"11个项目"有什么问题呢?
请在讨论此声明之前阅读文章:名称中的“Array”一词并不意味着有序序列,也不排除长度或哈希等其他概念的使用。如果您使用的是不同的定义,请确保说明它是什么以及对于给定操作的期望行为是什么。

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