我搜索一种通过引用获取索引的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


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

谢谢,

最佳答案

如果所有存储的值都是对象,则一种基本的实现方式是:

(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隐藏“ marking”属性,具体取决于您定位的浏览器。

09-19 11:46