基本上,我正在尝试创建一个包含唯一对象的对象,一个集合。我有一个绝妙的想法,那就是只使用一个JavaScript对象和属性名称的对象。比如,
set[obj] = true;
在一定程度上,这是可行的。它可以很好地处理字符串和数字,但对于其他对象,它们似乎都“散列”到相同的值并访问相同的属性。是否有某种方法可以为对象生成唯一的散列值?字符串和数字是如何做到这一点的,我可以覆盖相同的行为吗?
发布于 2011-11-10 16:01:45
如果你想要一个像JavaScript中的Java那样的hashCode()函数,那就是你想要的:
String.prototype.hashCode = function(){
var hash = 0;
for (var i = 0; i < this.length; i++) {
var character = this.charCodeAt(i);
hash = ((hash<<5)-hash)+character;
hash = hash & hash; // Convert to 32bit integer
}
return hash;
}
这就是Java (按位运算符)的实现方式。
请注意,hashCode可以是正的,也可以是负的,这是正常的,请参阅HashCode giving negative values。因此,您可以考虑将Math.abs()
与此函数一起使用。
发布于 2009-05-20 02:52:00
要做到这一点,最简单的方法是为每个对象提供自己唯一的toString
方法:
(function() {
var id = 0;
/*global MyObject */
MyObject = function() {
this.objectId = '<#MyObject:' + (id++) + '>';
this.toString= function() {
return this.objectId;
};
};
})();
我也遇到过同样的问题,这对我来说完美地解决了这个问题,而且比重新实现一些胖的Java风格的Hashtable
并将equals()
和hashCode()
添加到对象类要容易得多。只要确保你没有把一个字符串'<#MyObject:12>‘放入你的散列中,否则它会用这个id清除你正在退出的对象的入口。
现在我所有的哈希都很酷了。几天前我还发布了一篇关于this exact topic的博客文章。
发布于 2011-11-10 17:31:39
ECMAScript 6规范(JavaScript的下一版本)的一部分Harmony WeakMaps已经涵盖了您所描述的内容。也就是说:一个集合,其中的键可以是任何东西(包括未定义的),并且是不可枚举的。
这意味着除非直接引用键(任何对象),否则不可能获得对值的引用。与之相关的链接。它对于与效率和垃圾收集相关的一系列引擎实现原因很重要,但它也非常酷,因为它允许新的语义,如可撤销的访问权限和在不暴露数据发送者的情况下传递数据。
来自MDN
var wm1 = new WeakMap(),
wm2 = new WeakMap();
var o1 = {},
o2 = function(){},
o3 = window;
wm1.set(o1, 37);
wm1.set(o2, "azerty");
wm2.set(o1, o2); // A value can be anything, including an object or a function.
wm2.set(o3, undefined);
wm2.set(wm1, wm2); // Keys and values can be any objects. Even WeakMaps!
wm1.get(o2); // "azerty"
wm2.get(o2); // Undefined, because there is no value for o2 on wm2.
wm2.get(o3); // Undefined, because that is the set value.
wm1.has(o2); // True
wm2.has(o2); // False
wm2.has(o3); // True (even if the value itself is 'undefined').
wm1.has(o1); // True
wm1.delete(o1);
wm1.has(o1); // False
WeakMaps可以在当前的火狐,浏览器和边缘浏览器中使用。在Node v7和v6中使用--harmony-weak-maps
标志也支持它们。
https://stackoverflow.com/questions/194846
复制相似问题