3

好的,首先让我告诉你,我在 JavaScript 方面的经验远远不够……(也许我什至试图实现该语言实际上不支持的东西?)。

所以……我们来了……

我想创建一个这样的结构(这只是一个说明性的例子):

Addresses
    --- John
           --- Phone
           --- Address
    --- Peter
           --- Phone
           --- Address

所以,我已经看到(或者我只是在猜测)我可以做这样的事情(我已经在 Chrome 的 JavaScript 控制台中运行了所有测试):

var addresses = [];
addresses["John"] = {};
addresses["John"].Phone = "12312312312";
// And so on...

然而 :

  • 如果我这样做,addresses['123'] = {};则构造一个适当的 124 条目数组。
  • 如果我这样做,addresses['somestring'] = {};那么addresses仍然是一个空数组[]

我究竟做错了什么?JavaScript 中是否没有对正确字典(或地图——不管这个东西如何调用)的原生支持?


请注意:我希望能够逐步将条目添加到地址,以及每个地址条目的键(而不仅仅是一次性创建它)。

4

4 回答 4

7

您正在创建一个数组,但随后您将其用作对象(这是可能的,因为数组恰好是一个对象)。要包含属性而不是编号索引,您应该使用一个对象:

var addresses = {};
addresses["Holmes"] = { Phone: "14", Address: "Baker street 221b" };
于 2013-02-21T09:28:46.040 回答
2

JavaScript 有对象和数组。

数组是一种对象,它处理具有特殊意义的数字属性。它将具有length基于最高值属性名称(即数字)的属性,并且具有诸如 和 等方法pushpop根据forEach其数字操作其数字成员。

如果我这样做,addresses['123'] = {};则构造一个适当的 124 条目数组。

你已经有一个数组。这只是添加一个调用123它的成员并更新它的length.

If I do addresses['somestring'] = {};

这会将该成员添加到数组中,但它不会出现在任何访问数组成员的常规方法中。您必须按名称访问它。

不要将命名属性赋予数组。使用普通对象。

是否没有对正确词典的本机支持

一个物体尽可能接近。

如果您想要订购的东西,请使用具有数字属性的数组。

如果您想要带有命名键的东西,请使用对象。

于 2013-02-21T09:31:02.747 回答
1

当你这样做时,你会addresses['somestring'] = {};得到一个空数组,因为{}你正在分配一个空对象。

相反,如果你这样做addresses["dd"] = {s: "s"}addresses就会有对象

于 2013-02-21T09:32:22.710 回答
0

Javascript 没有字典、地图或关联数组。

但是,它确实具有非常相似的对象。(它们也可能完全不同,因此必须了解这一点。)

为了让事情更混乱,数组一个对象。您可以将随机属性放在数组上,它会像对象一样工作。

Javascript 数组采用整数 [*] 索引并调整.length属性。

对象采用字符串属性名称。这很重要:如果您使用的不是字符串,它将被转换为一个 .. 通常称为[Object object]

可能想读这个: http ://eloquentjavascript.net/chapter4.html

[*] 是的,是的,是的——他们真的是幕后的字符串。将它们视为整数并避免这种悲伤更容易。

于 2013-02-21T09:33:43.113 回答