[解決済み] オブジェクトからすべてのプロパティを削除する
質問
この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 = {};
で十分です。しかし、他の変数で元のオブジェクトへの参照を保持している場合、深い暗黙のオブジェクトプロパティの削除を使用することを考慮することができます。
関連
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み] JavaScriptのオブジェクトが空であることをテストするにはどうすればよいですか?
-
[解決済み] JavaScriptのオブジェクトにキーが存在するかどうかをチェックする?
-
[解決済み] 2つのJavaScriptオブジェクトのプロパティを動的にマージするにはどうすればよいですか?
-
[解決済み] package.jsonの各依存関係を最新バージョンに更新する方法は?
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
-
[解決済み] WebStormで未解決の変数が大量にある場合の警告に対処する方法は?
-
[解決済み] モデルフェッチ時に1をtrueに、0をfalseに変換する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] JavaScriptのオブジェクトを素早くクリアするには?
-
[解決済み] JavaScriptを使用してHTML要素に属性を追加/更新するには?
-
[解決済み] JavaScriptで:hoverのCSSプロパティを変更する
-
[解決済み] JavaScriptでの大文字小文字を区別しない正規表現
-
[解決済み] Node.jsのES6クラスをrequireで作る
-
[解決済み] <ng-content>が空かどうかを確認する方法は?(これまでのAngular 2+で)
-
[解決済み] なぜjavascriptのES6 Promisesはresolve後も実行を継続するのですか?
-
[解決済み] HTML要素にスクロールバーがあるかどうかをチェックする
-
[解決済み] querySelectorAllがない場合、ライブラリを使用せずに属性で要素を取得する?
-
[解決済み] Fetch: ステータスがOKでない場合、プロミスを拒否し、エラーをキャッチするか?