使用一对/元组作为多值键/索引的JavaScript关联数组

4
在Python中,我可以使用元组作为字典的键。在JavaScript中有什么等效的方法?
>>> d = {}
>>> d[(1,2)] = 5
>>> d[(2,1)] = 6
>>> d
{(1, 2): 5, (2, 1): 6}

对于那些感兴趣的人,我有两个数组...

positions = ...

normals = ...

我需要创建一个由位置/法线对组成的第三个数组,但不想有重复的对。我的关联数组可以让我检查是否存在一个[(posIdx, normalIdx)]对,以便重用它,或者如果没有则创建一个。

我需要一种使用两个值作为键进行索引的方法。我可以使用字符串,但这似乎比两个数字慢一些。


目前实际上还没有(即将推出的JavaScript版本将包括其中之一) - 是否有特定的原因这样做? - Qantas 94 Heavy
你到底想做什么?我的意思是,你实际上可以使用元组的字符串表示作为数组的键,但这样做有点痛苦。你也可以像Stepan在他的回答中提到的那样使用一个真正的二维关联数组。如果你说出你想做什么,并展示一下你如何使用上述数据结构,我认为你会得到更好的答案。 - barry-johnson
一个位置是否可以有多个法线,反之亦然? - Ja͢ck
@Jack 是的,这正是我需要双值键的原因。我的应用程序需要在1:1比例上使用位置/法线,但如果我不重复使用现有的对,数据会变得更大。 - jozxyqk
2个回答

5

Javascript没有元组,但是你可以使用数组代替。

>>> d = {}
>>> d[[1,2]] = 5
>>> d[[2,1]] = 6
>>> d
Object {1,2: 5, 2,1: 6}

5
请注意,这只使用了数组的字符串表示,即 d['1,2']d[[1,2]] 相同。 - Qantas 94 Heavy

1
你可以使用Map: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Map 一个对象的键必须是字符串或符号,而Map的键可以是任何值,包括函数、对象和任何基本类型。
这将避免键仅仅是数组的字符串表示形式可能引发的问题。

d = {};
d[[1,2]] = 5;
d[[2,1]] = 6;
console.log("d[[1,2]]:", d[[1,2]]);
console.log("d['1,2']:", d['1,2']);

m = new Map();
ak1 = [1,2];
ak2 = [1,2];
m.set([1,2], 5);
m.set([2,1], 6);
m.set(ak1, 7);
console.log("m.get('1,2'):", m.get('1,2'));
console.log("m.get([1,2]):", m.get([1,2]));
console.log('m.get(ak1):', m.get(ak1));
console.log('m.get(ak2):', m.get(ak2));

请注意,它使用变量引用作为键,而不是值。

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