【发布时间】:2012-01-22 05:43:23
【问题描述】:
我正在寻找使用对象作为键的关联映射/数组/哈希的 javascript 方式。使用 flash.utils.Dictionary 替代您可以在 ActionScript 3 中执行的操作。我敢肯定 java 和 C# 也有类似的东西。
它与基于普通对象的 assoc[key] 的普通通用对象相同,但您使用整个对象作为键而不是基于字符串的属性(它不会像 Object 那样匹配 toString() ,而是匹配唯一实例)。装饰您不拥有的对象非常方便(通过将对象用作键并将您的装饰用作值)。
伪代码:
decorations[objectA] = [lights, sparkles, ..];
decorations[objectB] = [skulls, spikes, ..];
if(someObject in decorations)
updateDecorations(someObject , decorations[someObject])
javascript 中的说明以及为什么它不适用于对象:
// make two objects with same toString() return value
var objA = {toString:function(){return 'foo'}};
var objB = {toString:function(){return 'foo'}};
//use objects as keys
var assoc = {};
assoc[objA] = 'dataA';
assoc[objB] = 'dataB';
// seperate instances are not equal
console.log(objA == objB);
// still same data associated: dataB, dataB
console.log(assoc[objA]);
console.log(assoc[objB]);
//with a Dictionary instead of this would be dataA, dataB
主要问题是我只需要在对象上进行匹配(它正在被其他一些您不干预的进程使用,但我们仍然需要关联)。所以没有魔法 .__hash 道具或 toString() 重载(如果可能的话)。
有什么想法吗?
编辑:我检查了一下,但都是 toString() 或添加魔法道具
【问题讨论】:
-
对象中真的没有一些唯一的 id 字段可以用作键吗?如果没有,您需要添加一个 - 或者可能使用对象内容的序列化作为键,尽管这听起来像是一个糟糕的性能选择
-
我想过:我可以获取属性名称,对它们进行排序并按该顺序连接值,它会给我一个近乎唯一的键(假设数据不同)。但后来我将容器的身份链接到数据,似乎不安全。
标签: javascript actionscript-3 dictionary reference associative-array