最有效的方式是將一個物件的所有鍵轉換為小寫字母的方法是什麼?
P粉066224086
2023-08-22 12:42:40
<p>我想出了以下解</p>
<pre class="brush:php;toolbar:false;">function keysToLowerCase (obj) {
var keys = Object.keys(obj);
var n = keys.length;
while (n--) {
var key = keys[n]; // "cache" it, for less lookups to the array
if (key !== key.toLowerCase()) { // 可能已經是小寫形式
obj[key.toLowerCase()] = obj[key] // 將值交換到新的小寫鍵
delete obj[key] // 刪除舊鍵
}
}
return (obj);
}</pre>
<p>但是我不確定v8會如何處理,例如,它是否真的會刪除其他鍵,還是只會刪除引用,然後垃圾回收器會在後面咬我? </p>
<p>此外,我創建了這些測試,希望您能在那裡添加您的答案,以便我們可以看到它們的匹配情況。 </p>
<p><strong>編輯1:</strong> 顯然,根據測試結果,如果我們不檢查鍵是否已經是小寫形式,速度會更快,但是除了速度更快之外,它會透過忽略這一點而創造更多的混亂嗎?垃圾回收器會對此滿意嗎? </p>
使用
Object.fromEntries
(ES10)使用新的
Object.fromEntries
方法的本地和不可變解決方案:在該函數廣泛可用之前,您可以使用以下polyfill自訂定義:
一個好處是,此方法與
Object.entries
相反,因此現在您可以在物件和陣列表示之間來回切換。我想到的最快的方法是建立一個新物件:
我對v8的目前內部工作機制不夠熟悉,無法給出明確的答案。幾年前,我看過一個視頻,開發人員在其中討論了對象,如果我沒記錯的話,它只會刪除引用,並讓垃圾收集器處理。但那是幾年前的事了,所以即使當時是這樣,現在也不一定是這樣。
它會在以後給你帶來麻煩嗎?這取決於你在做什麼,但可能不會。創建短暫物件是非常常見的,所以程式碼被最佳化來處理它。但每個環境都有其限制,也許它會給你帶來麻煩。你必須使用實際數據進行測試。