0

我搜索了一种在 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

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

谢谢,

4

2 回答 2

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

于 2012-08-28T17:48:27.217 回答
0

如果您的代码说您希望最后一个条件评估为真,那么只需使用一个对象和“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

但是,如果您希望 ({} in mystuff) 评估为 false,那就大不相同了。

于 2012-08-28T17:32:29.377 回答