我搜索一种方法来获取Javascript一个通过引用索引的对象。
类似的东西:
var myRefMap = new RefMap();
var a = [{}, [], function () {}];
myRefMap.set(a[0], true);
myRefMap.set(a[1], { hello: 'world' });
myRefMap.set(a[2], 42);
myRefMap.has(a[0]); // true
myRefMap.has(a[1]); // true
myRefMap.has(a[2]); // true
myRefMap.has({}); // false
myRefMap.has([]); // false
myRefMap.has(function () {}); // false
我需要这个对象,以便在循环引用中的树浏览期间优化并避免实际的重型数组搜索。
谢谢,
答案 0 :(得分:1)
执行此操作的一种基本方法,前提是所有存储的值都是对象,如下所示:
(function () {
var instCount = 0;
self.RefMap = function () {
instCount ++;
var propName = '__RefMap' + instCount + '__';
this.has = function (o) {
return propName in o;
};
this.set = function (o) {
o[propName] = true;
}
this.remove = function (o) {
delete o[propName];
}
}
}());
//then use it like
var myRefMap = new RefMap();
编辑:数组和函数也是对象。您可以使用Object.defineProperty来隐藏“标记”属性,具体取决于您定位的浏览器。
答案 1 :(得分:0)
如果你的代码说你想要将最后一个条件评估为true,那么只使用一个对象并且'in'指令应该可以正常工作。
var mystuff = {};
var a = [{}, [], function () {}];
mystuff[a[0]] = true;
mystuff[a[1]] = {hello:'world'};
mystuff[a[2]] = 42;
(a[0] in mystuff); // true
({} in mystuff); // true
(a[1] in mystuff); // true
(a[2] in mystuff); // true
如果你想要({}在mystuff中)评估为假,那就差别很大。