4

ねえ、私はこのような配列オブジェクトを持っています

[{
    public: "public",
    private: "private",
    [{
        properties: {...
        },
        instance: {.....
        }
    }, {...
    }, {...
    }]
}, {...
}, {....
}]

ここで、最も外側の配列には、クラス A のオブジェクトが含まれています。これには、いくつかの public props といくつかの private porps があり、クラス B のオブジェクトを含む配列も含まれています。これには、いくつかの public フィールドと private フィールドも含まれています。

基本的にこれが私のヒエラルキーです

array = [A1,A2,A3,A4,....]//object of A

var A = function(){
  var Const = function(){
    this.public_prop;
    this.private_prop;
    this.list = [B1,B2,B3,B4]// objects of B
  }
 //.........
 return Const;
}();

var B = function(){

  var Const = function(){
   this.public_prop;
   this.private_prop;
  }
 //.........
 return Const;
}();

今、文字列化(シリアル化)している間、シリアル化された文字列に public prop と配列のみを含めたいと思います。

たとえば、上記の JSON 表現の場合、次のようなものが必要です

[{
        public: "public",
        [{
            properties: {...
            }
        }, {...
        }, {...
        }]
    }, {...
    }, {....
    }]

これで、文字列化する必要があるフィールドのみを返す関数getState() を各クラスに作成できますが、シリアル化する前に JSON.stringify のネイティブ実装でメソッドを呼び出す方法を見つけることができないようです。これを達成する方法はありますか?

JSON.stringify () からの出力で特定の値を非表示にする を参照しましたが、単一の階層で単純な数値または文字列の小道具を除外する方法についてのみ説明していますが、複数の階層で小道具を除外する方法は?

注:私のクラスはすべてモジュールパターンに従います

4

3 に答える 3

6
var result = JSON.stringify(myjson, function(key, val) {
    if (key !== "private")
        return val;
});

上部のオブジェクトの例は有効な構文ではありませんが、という名前のプロパティを除外するには"private"、これが機能するはずです。

于 2012-09-17T19:18:59.443 に答える
5

質問タグが示すようにJavaScriptを記述していると仮定すると(サンプルコードはほぼc#のように見えますが):「stringify」や「getState」ではなく、シリアル化するオブジェクトの「toJSON」メソッドをオーバーライドする必要があります。 。

したがって、publicプロパティと"private"プロパティを持つオブジェクト"Message"がある場合は、次に示すように、publicプロパティのみを返す"toJSON"メソッドを定義する必要があります。

var Message = function() {
    this.myPrivateProperty = "Secret message";
    this.myPublicProperty = "Message for the public";

    this.toJSON = function() {
        return {
            "public": this.myPublicProperty
        };
    };
}


alert(JSON.stringify(new Message()));    // {"public":"Message for the public"}
于 2012-09-17T23:33:59.540 に答える