在Javascript中引用索引集合

时间:2012-08-28 17:19:41

标签: javascript node.js firefox google-chrome v8

我搜索一种方法来获取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

我需要这个对象,以便在循环引用中的树浏览期间优化并避免实际的重型数组搜索。

谢谢,

2 个答案:

答案 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中)评估为假,那就差别很大。