使用对象作为字典,将数组作为JS中的键

时间:2013-08-26 20:37:22

标签: javascript dictionary key

我正在尝试将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'

我知道我可以使用数组来代替我的字典对象,只需迭代并进行比较,但希望能够利用更快的查找速度。

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

有没有办法实现我追求的目标?

1 个答案:

答案 0 :(得分: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]对数组中的线性搜索更快。

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