Javascript 在JS中将对象用作字典,将数组用作键

Javascript 在JS中将对象用作字典,将数组用作键,javascript,dictionary,key,Javascript,Dictionary,Key,我试图将一个JS对象视为一个字典,我想使用一对值(一个文本值,另一个对象)作为一个键,我一直将其放在数组形式中,但没有成功。问题在于,只有文字值用于区分键,如以下代码段所示: var dictionary = {}; var keyOne = { blah:1 }; var keyTwo = { blegh:2 }; var keyArrayOne = [keyOne, "label"]; var keyArrayTwo = [keyTwo, "label"]; dictionary[ke

我试图将一个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'
我知道我可以使用数组代替dictionary对象,只需迭代和比较,但我希望利用更快的查找

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


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

这些方法可能会有帮助:

  • 请记住
    JSON.stringify
    不适用于循环对象。另外,该方法假定
    JSON.stringify
    以相同的顺序返回对象属性(请参见第一个链接和中的注释)

  • 如果您不担心正在修改传入的对象,那么另一种方法可以工作;您将使用完全相同的对象实例进行查找,因为使用具有相同值的另一个实例将不起作用。此外,在您的情况下,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]的数组,通过该数组进行线性搜索(就像哈希表中的一个bucket)。如果每个标签上的对象数量相对于对象总数而言是“小”的,那么这可能仍然比[label,object]对数组中的线性搜索快


也就是说,在优化原始代码之前,您可能希望首先衡量性能的影响,以确保它是值得的。

这些可能会有所帮助:

  • 请记住
    JSON.stringify
    不适用于循环对象。另外,该方法假定
    JSON.stringify
    以相同的顺序返回对象属性(请参见第一个链接和中的注释)

  • 如果您不担心正在修改传入的对象,那么另一种方法可以工作;您将使用完全相同的对象实例进行查找,因为使用具有相同值的另一个实例将不起作用。此外,在您的情况下,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]的数组,通过该数组进行线性搜索(就像哈希表中的一个bucket)。如果每个标签上的对象数量相对于对象总数而言是“小”的,那么这可能仍然比[label,object]对数组中的线性搜索快


也就是说,在优化原始代码之前,您可能希望首先衡量性能的影响,以确保它是值得的。

两个数组都是[“objectObject”,“label”]。如果您不需要安全地包含诸如“valueOf”、“proto”等键,只需在需要时使用object和object.keys(obj)来获取一组键。啊,感谢您的回复。在物体问题上我和你是一致的;问题是我使用对象作为键的任何部分,而不是数组。我只是在和这个物体斗争。恐怕是钥匙(obj)的建议。你能指出它如何适合我发布的代码片段吗?谢谢。两个数组都是[“objectObject”,“label”]。如果您不需要安全地包含诸如“valueOf”、“proto”等键,只需在需要时使用object和object.keys(obj)来获取一组键。啊,感谢您的回复。在物体问题上我和你是一致的;问题是我使用对象作为键的任何部分,而不是数组。我只是在和这个物体斗争。恐怕是钥匙(obj)的建议。你能指出它如何适合我发布的代码片段吗?谢谢。很好的答案和想法,谢谢。在某个时刻,两个关键对象的所有属性都可能是相同的。尽管不太可能导致冲突,但在key对象上添加key属性感觉有点脏:D键/数组组合听起来是速度和清洁度方面的最佳折衷方案,因此我将与成熟的数组方法进行权衡,并将性能与实现整洁度进行比较。回答不错,谢谢。在某个时刻,两个关键对象的所有属性都可能是相同的。尽管不太可能引起冲突,但在key对象上添加key属性感觉有点脏:D key/array组合听起来是速度和清洁度方面的最佳折衷方案,因此我将与成熟的数组方法进行权衡,并比较性能和实现整洁度。