1

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

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'

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

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

有什么办法可以实现我所追求的吗?

4

1 回答 1

1

这些可能会有所帮助:

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

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

  • 请记住,JSON.stringify不适用于圆形物体。该方法还假定JSON.stringify以相同的顺序返回对象属性(请参阅第一个链接和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] 对数组中的线性搜索快。

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

于 2013-08-26T22:23:56.023 回答