1. ホーム
  2. javascript

[解決済み] オブジェクトからすべてのプロパティを削除する

2023-05-03 13:02:40

質問

このJavascriptオブジェクトを持っています。

req.session

私のコードでは、このオブジェクトにプロパティを追加しています。これらのプロパティは他のオブジェクトであったり、配列であったり、単なる文字列であったりします。

req.session.savedDoc = someObject; 
req.session.errors = ['someThing', 'anotherThing', 'thirdThing'];
req.session.message = 'someString'

後でこのオブジェクトの追加されたプロパティをすべて消去したい場合、最も簡単で最良の方法は何でしょうか?

これより良い方法があるはずですが?

// Delete all session values
delete req.session.savedDoc;
delete req.session.errors;
delete req.session.message;

どのように解決するのですか?

この問題には2つの解決方法があります。

空のオブジェクトを割り当てる

req.session = {};

ガベージコレクタは自動的にメモリを掃除します。このバリアントは超高速で、ほとんどの場合うまくいきますが、 しかし、このバリアントと一緒に使うには 注意 というのも、オブジェクトへの参照をメモリ内に保持する可能性があるからです。この注意点は TLDR のセクションで説明します。

プロパティを1つずつ削除する

Object.keys(object).forEach(key => delete object[key]);

これは、プロトタイプでないすべてのプロパティを調べ、それを削除することで、オブジェクトをきれいにします。これはより安全ですが、より遅いです。特定のケースでそれを使うことが理にかなっているかどうかを判断する必要があります。


TLDR

上記のどの解決策も、この質問で提供された他の有効な解決策と同様に、現在の状況において作者のために仕事をします。それは主に、開発者が非推奨のデータをどのように操作したいかに依存します。

セッションオブジェクトは、異なる変数によってリンクされたデータを含むことができ、新しい空のオブジェクトを req.session に設定しても、古いデータへの参照は壊れないので、古いデータはまだ必要な場所で利用できます。古いデータを保持する正しい方法は、初期オブジェクトをクローンすることですが、現実のシナリオは異なることがあります。次の例を見てみましょう。

req.session.user = { name: "Alexander" };  // we store an object in the session
var session = req.session;                 // save reference to the session in a variable
console.log( req.session, session );       // {user: Object}, {user: Object}

req.session = {};                          // let's replace session with a new object
console.log( req.session, session );       // {}, {user: Object}

古いデータを session 変数から古いデータを取り出すことができますが req.session は空です。ここで、新しいオブジェクトを設定することは、深いクローニングの代わりとして働きます。ガベージコレクタは古い req.session オブジェクトによって参照されているため、ガベージコレクタは古い session 変数によって参照されています。

でオブジェクトのディープクリーニングを行います。

Object.keys(object).forEach(key => delete object[key]);

...する 明示的に からすべての値を削除します。 req.session オブジェクトからすべての値を削除し、さらに session 変数が同じオブジェクトにリンクされています。 session も同様に空になります。どのように動作するか見てみましょう。

req.session.user = { name: "Alexander" };  // we store an object in the session
var session = req.session;                 // save reference to the session in a variable
console.log( req.session, session );       // {user: Object}, {user: Object}

Object.keys(req.session).forEach(key => delete req.session[key]);
console.log( req.session, session );       // {}, {}

これでお分かりのように、どちらの場合も空のオブジェクトを得ることができます。

速度とメモリの観点から、新しい空のオブジェクトを設定することは より速く しかし、古いデータがまだどこかで参照されている場合、新しいオブジェクトのアプローチでは、古いデータが消費しているメモリは解放されません。

どのようなアプローチを取るかは、コーディングのシナリオに依存することは明らかですが、ほとんどの場合 req.session = {}; で十分です。しかし、他の変数で元のオブジェクトへの参照を保持している場合、深い暗黙のオブジェクトプロパティの削除を使用することを考慮することができます。