2016-10-21 9 views
-2

を使用して作成したオブジェクトに追加したプロパティがJSON.stringifyに残っていないという問題が発生しました。オブジェクトを削除するためにオブジェクトを拡張する必要があるのはなぜですか?

私はこのSOスレッドが見つかりました:JSON.stringify is ignoring object properties

を、溶液が私のために働いた - 私は、私はdelete newObj.toJSONを呼び出すことができました、私のmySerializedFormArrayオブジェクトを拡張し、新しいオブジェクトを作成しました。

私が単にdelete mySerializedFormArray.toJSON;と呼んだ場合、追加した新しいプロパティは、文字列化中に削除されます。

なぜオブジェクトを拡張すると機能するのですか?

編集:

var DynExport = $('#frmDynExport').serializeArray(); 

DynExport.IsFooEnabled = $("#hdnFooFlag").val(); 

var newObj = $.extend({}, DynExport); 

delete newObj.toJSON; 

var someOtherVar = JSON.stringify(newObj); 
DynExport = JSON.stringify(DynExport); 

someOtherVarDynExportにはない、IsFooEnabledが含まれます。

+3

実際のコードを掲載する必要があります。 – Pointy

+0

@Pointy Done。私はそれが本当に必要ではなかった私はリンクされたスレッドで正確なコードを使用しているので、私は考え出した。 – sab669

+0

削除したいオブジェクトをObject.freezeでフリーズできますか?それはここで意味をなさないでしょうし、すべてを新しい(フリーズされていない)オブジェクトにコピーすると動作します。 –

答えて

2

.serializeArray()メソッドは配列を返します(おそらく驚くことではありません)。配列は、JSONとしてシリアル化されるとき、それはこのように見える終わる:

[ value, value, value, ... ] 

プロパティ名は、配列の値の数値インデックスであり、それらは暗黙のだ:最初の値は、要素に対応0、2番目の要素は1などです。

この表現のスキームでは、数値名を持たないプロパティを配置する場所はありません。つまり、「実際の」配列の一部ではないプロパティです。もちろん、このようなプロパティはJavaScriptでも問題ありませんが、JSONで表現する方法はありません。

$.exend()持つ新しいプレーンなオブジェクトに(あなたの「IsFooEnabled」プロパティと一緒に)アレイのプロパティをコピーすることによって、プレーンなオブジェクトのJSONシリアライズスキームが明示的にすべてのプロパティ名が含まれているため、あなたはその問題を回避します。

関連する問題