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

これを行う基本的な方法の 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

最後の条件を 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 に評価する場合は、状況が大きく異なります。

于 2012-08-28T17:32:29.377 に答える