【问题标题】:Using an object as a dictionary with arrays as keys in JS在JS中使用对象作为字典,数组作为键
【发布时间】:2013-08-29 10:37:17
【问题描述】:

我正在尝试将 JS 对象视为字典,并且我想使用一对值(一个文字值,一个其他对象)作为一个键,我一直将其放入数组形式,没有成功。问题是只有文字值可以区分键,如下面的 sn-p 所示:

var dictionary = {};

var keyOne = { blah:1 };
var keyTwo = { blegh:2 };

var keyArrayOne = [keyOne, "label"];
var keyArrayTwo = [keyTwo, "label"];

dictionary[keyArrayOne] = "some data";

console.log(dictionary[keyArrayTwo]);    //Console returns 'some data'

我知道我可以使用数组代替我的字典对象,并且只是迭代和比较,但希望利用更快的查找。

关于更多信息,我对构成键的第一个元素的对象一无所知(它可以是任何东西),但第二部分始终是一个字符串。

有什么方法可以实现我的目标吗?

【问题讨论】:

  • 两个数组都是 ["objectObject","label"]。如果您不需要安全地包含“valueOf”、“proto”等键,只需在需要时使用对象和 Object.keys(obj) 来获取键数组。跨度>
  • 啊,谢谢您的回复。我在对象问题上与您同在;问题是我将对象用作键的任何部分,而不是特别是数组。恐怕我只是在为 Object.keys(obj) 建议而苦苦挣扎。你能指出它如何适合我发布的 sn-p 吗?谢谢。

标签: javascript dictionary key


【解决方案1】:

这些可能会有所帮助:

https://stackoverflow.com/a/10893426/1090464

https://stackoverflow.com/a/10908885/1090464

  • 请记住JSON.stringify 不适用于圆形对象。该方法还假定 JSON.stringify 以相同的顺序返回对象属性(参见第一个链接中的 cmets 和 https://stackoverflow.com/a/17459406/1090464)。

  • 如果您不担心正在修改传入的对象,则另一种方法可以使用;并且您将使用完全相同的对象实例进行查找,因为使用具有相同值的另一个实例将不起作用。此外,在您的情况下,get/put 函数会有所不同,可能是这样的:

    put: function(obj, label, value) {
        obj.__hash_id = this.nextId();
        this.hash[[obj.__hash_id, label]] = value;
    }
    
    get: function(obj, label) {
        return this.hash[[obj.__hash_id, label]];
    }
    
  • 另一种方法是使用标签作为键,并将值设为 [objectPartOfKey, value] 的数组,通过该数组进行线性搜索(就像哈希表中的存储桶)。如果每个标签的对象数量相对于对象总数而言“小”,这可能仍然比在 [label, object] 对数组中的线性搜索要快。

话虽如此,您可能希望在优化原始代码之前先衡量性能影响,以确保值得。

【讨论】:

  • 好的答案和想法,谢谢。有可能,在某些时候,两个关键对象的所有属性都可能相同。即使它不太可能引起冲突,在关键对象上添加关键属性感觉有点脏:D 键/数组组合听起来是速度和清洁度的最佳折衷方案,所以我会权衡一下-吹数组方法,并比较性能与实现整洁度。
猜你喜欢
  • 1970-01-01
  • 2012-08-31
  • 2021-12-17
  • 2016-05-14
  • 2011-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-23
相关资源
最近更新 更多