JavaScript 中的关联数组与对象

IT技术 javascript
2021-01-18 14:15:43

在我的脚本中需要创建一个哈希表,我在谷歌中搜索了这个。大多数人为此目的推荐 JavaScript 对象。问题是哈希表中的某些键有一个“.”。在他们之中。我可以使用关联数组轻松创建这些键。

我不明白为什么关联数组不好。在我查看的网站上提到的第一件事是长度属性。

我来自 Perl 背景,在那里我使用了哈希。最常见的用途是从键中获取值、检查键是否存在、删除键值对以及添加键值对。如果这些是我的常用用途,我可以安全地使用关联数组吗?

6个回答

在 JavaScript 中,对象是关联数组……它们没有单独的概念。您还可以安全地使用 '.' 在键名中,但您只能使用括号表示法访问该值:

var foo = {}
foo['bar'] = 'test';
foo['baz.bin'] = 'value';

alert(foo.bar); // Shows 'test'
alert(foo['baz.bin']); // Shows 'value'

如果您已经在使用它们并且它们有效,那么您就是安全的。

问题是 foo.length=0
2021-03-15 14:15:43
@JustinNiessner 在我的节点应用程序中,我确实有关联数组的 map、reduce 等。
2021-03-20 14:15:43
我认为您不能将对象概括为关联数组,主要是因为对象不会具有关联数组已实现的方法。(实施例:mapreducefilter,等等)
2021-03-22 14:15:43
请注意,与例如 PHP 关联数组相反,对象属性未排序,即您不能依赖它们的顺序。
2021-03-25 14:15:43
@hlin117 - 关联数组(对象)也没有这些方法。只有普通数组才有这些方法。
2021-03-30 14:15:43

在 JavaScript 中,对象和数组几乎是一回事,数组具有一些神奇的功能(自动更新长度属性等)和适用于数组的原型方法。构造一个对象也比使用关联数组容易得多:

var obj = {"my.key": "myValue"};

对比

var obj = [];
obj["my.key"] = "myValue";

因此永远不要为此使用数组对象,而只是使用常规对象。

一些功能:

var obj = {}; // Initialized empty object

删除键值对:

delete obj[key];

检查密钥是否存在:

key in obj;

获取键值:

obj[key];

添加键值对:

obj[key] = value;
我认为在 JS 中说数组和对象是一回事是不正确的。我的意思是,按照这个标准,JS 中的几乎所有东西都与对象大致相同。数组允许您像设置任何其他类型的对象一样设置任意属性。但是,对象本身没有有序数据的概念。
2021-03-23 14:15:43
@realtebo 没有一流的语法,如果需要,您可以为它制作一个函数
2021-03-26 14:15:43
如何获取对象的大小?
2021-03-28 14:15:43
与其说“对象[s] 和数组[s] 几乎是一回事”,倒不如说数组对象(但反之亦然)。
2021-03-28 14:15:43
这个答案中关于不使用数组作为关联数组的部分,因为它需要两行代码而不是一行代码,这非常具有误导性。该构造不填充目标元素,它设置数组的一个属性,与@Dominic Goulet 和 NullUserException 同时在帖子中描述的完全相同,IMO 是正确答案。它表现得像一个关联数组(你可以引用 obj["my.key"])的唯一原因是该数组的属性是一个对象,并且对象与 Javascript 具有关联数组一样接近。
2021-04-06 14:15:43

因为JavaScript 中没有内置关联数组这样的东西这就是为什么它很糟糕。

事实上,当你使用类似的东西时:

theArray["a"] = "Hello, World!";

它只是创建一个名为“a”属性并将其值设置为“Hello, World!”。这就是为什么长度总是0,以及为什么输出alert(theArray)为空的原因。

当然,javascript 中有关联数组之类的东西。只是没有关联数组内置概念。例如,闭包有一个关联数组:docs.closure-library.googlecode.com/git/...
2021-03-26 14:15:43
@JasonBaker OP 指的是 javascript(见标签),而不是谷歌库。当然,您可以在 javascript 中做任何您想做的事情,正如您所说,javascript 中没有内置关联数组这样的东西我认为这很明显,但我会更新答案。
2021-03-29 14:15:43

实际上,“关联数组”与 ECMAScript 中的“类数组对象”几乎相同。甚至数组也是 ECMAScript 中的对象,只是有数字键(它们仍然是后台的字符串)和一个.length属性,以及一些从Array.prototype.

因此,Perl 哈希和 ECMAScript 对象的行为相似。您可能不知道不仅可以通过点访问对象属性,还可以使用方括号和字符串访问对象属性,例如

var myObj = { foo: 42 };

myObj.foo; // 42
myObj['foo']; // 42

知道这一点,您还可以使用键 .

var myObj = { };
myObj['hello.foo.world'] = 42;

当然,您只能使用括号表示法访问该键。

.如果您愿意,您可以在 JavaScript 对象(AKA 关联数组)上使用键名;他们被毫无问题地接受了。一个小缺点是你不能使用带点键的快捷符号,例如

var x = {};
x['hello'] = 'there';
alert(x.hello);

是完全可以接受的,并且会弹出一个带有“那里”的警报。但是如果你使用带点的名字:

var x = {};
x['this.is'] = 'sparta';
alert(x.this.is);

将失败,因为 JavaScript 将查找this在 x 对象中命名的属性,该属性不存在。只有this.is属性。