私は次の解決策を思いつきました
function keyToLowerCase (obj) { var キー = Object.keys(obj); var n = キーの長さ; 一方 (n--) { var key = key[n]; // 配列への検索を少なくするために「キャッシュ」します if (key !== key.toLowerCase()) { // すでに小文字になっている可能性があります obj[key.toLowerCase()] = obj[key] // 値を新しい小文字キーに置き換えます delete obj[key] // 古いキーを削除します } } 戻り値 (obj); }
しかし、v8 がそれをどのように処理するかはわかりません。たとえば、実際に他のキーを削除するのでしょうか、それとも参照を削除するだけで、その後ガベージ コレクターが私を攻撃するのでしょうか?
また、これらのテストを作成しました。テストがどのように一致するかを確認できるよう、回答をそこに追加していただければ幸いです。
これによりさらに混乱が生じますか?ゴミ収集業者はこれで満足するでしょうか?
Object.fromEntries
新しいの使用 (ES10)
Object.fromEntries
この関数メソッドを使用したローカルで不変のソリューション:リーリー
が広く利用可能になるまでは、次のpolyfillカスタム定義を使用できます:リーリー
1 つの利点は、このメソッドがObject.entries
の逆であるため、オブジェクト表現と配列表現を行き来できることです。
私が考える最も早い方法は、新しいオブジェクトを作成することです:
リーリー私は、v8 の現在の内部動作について明確な答えを出せるほど詳しくはありません。数年前、開発者がオブジェクトについて説明しているビデオを見ましたが、私の記憶が正しければ、参照を削除してガベージ コレクターに処理させるだけでした。しかし、それは数年前のことなので、当時は真実だったとしても、今は必ずしも真実であるとは限りません。
後で迷惑がかかりませんか?それはあなたが何をしているかにもよりますが、おそらくそうではありません。一時的なオブジェクトの作成は非常に一般的であるため、コードはそれを処理できるように最適化されています。しかし、どの環境にも制限があり、問題が発生する可能性があります。実際のデータを使用してテストする必要があります。