【问题标题】:What is the javascript approach to an associative map with objects as keys (not strings but unique objects)?以对象为键(不是字符串而是唯一对象)的关联映射的 javascript 方法是什么?
【发布时间】: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


【解决方案1】:

前段时间我用JS写了一个字典类。这绝对不理想,因为它使用 Array 来存储值和键,但适用于小型集合。

您可以在这里找到它: https://github.com/creynders/creynders-js-lib

【讨论】:

    【解决方案2】:

    我做过类似的事情,将一个对象(19 个图标中的 1 个)关联到地图上。我通过 PHP 从 mysql 中提取信息,并将地图上的所有内容与其 X、Y 坐标相关联。

    当我向所有图标添加 mouse_rollover 时,我只需循环遍历数组并找到 X、Y 坐标匹配并显示一个面板,其中包含导入到多维数组中的所有其他值。

    你觉得这有帮助吗?如果是这样,我可以提供一些我用来执行此操作的代码。 jc

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-26
      • 2010-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-15
      相关资源
      最近更新 更多