引用Javascript中的索引集合

Reference indexed collection in Javascript

本文关键字:索引 集合 Javascript 引用      更新时间:2023-09-26

我搜索一种方法,在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来隐藏"标记"属性,具体取决于您所针对的浏览器。

如果您的代码表示希望最后一个条件求值为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中的{})评估为false,那就大不相同了。