亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 JavaScript 的列表中檢查對象是否存在的最快方法

在 JavaScript 的列表中檢查對象是否存在的最快方法

斯蒂芬大帝 2021-10-14 17:03:51
我有一個包含在內存中的 100,000 個項目的列表(所有這些大整數都存儲為字符串)。這些進來的數據結構并不重要。現在他們生活在這樣的數組中:const list = ['1','2','3'...'100000'];注意:以上只是一個例子 - 實際上,每個條目都是一個 18 位的字符串。我需要檢查一個對象的存在。目前我正在做:const needToCheck = '3'; const doesInclude = list.includes(needToCheck);但是,有很多方法可以進行這種存在性檢查。我需要它盡可能提高性能。我可以遵循的其他一些途徑是:創建一個Map值為 undefined創建一個對象 ( {}) 并創建對象的鍵作為 中的條目list,然后使用hasOwnProperty.用一個 Set()由于這些都是數字,因此請使用其他類型的數據結構(樹?)。但是,由于這些長度都是 18 位數字,因此性能可能會降低。我可以接受更高的前期成本來構建數據結構以在以后獲得更大的速度提升,因為這是針對每天將被點擊 > 1MM 次的 URL 路由。
查看完整描述

2 回答

?
守候你守候我

TA貢獻1802條經驗 獲得超10個贊

Array.prototype.includes是一個O(n)操作,這是不可取的 - 每次您想要檢查一個值是否存在時,您都必須迭代大部分集合(可能是整個集合)。

Map、Set 或 object 更好,因為檢查它們是否具有值是一種O(1)操作。

樹也是不可取的,因為查找必然會在樹下進行許多操作,如果樹很大并且您想要頻繁查找,這可能是一個問題 - 所以O(1)解決方案更好。

地圖雖然有效,但可能不合適,因為您只想查看值是否存在 - 您不需要鍵值對,只需要值。Set 僅由值組成(并且Set.has確實是O(1)),因此這是這種情況的最佳選擇。帶有鍵的對象雖然也可以工作,但可能不是一個好主意,因為它可能會創建許多不必要的隱藏類- Set 更適合在運行時針對動態值。

因此,Set 方法看起來是最高效和最合適的選擇。

您還可以考慮將計算移至服務器的可能性。100,000 個項目不一定太多,但在客戶端看到的數量仍然驚人。


查看完整回答
反對 回復 2021-10-14
?
狐的傳說

TA貢獻1804條經驗 獲得超3個贊

非常規地,您還可以使用一個對象并將 100,000 個項目中的每一個設置為一個屬性,因為在幕后,JavaScript Object 是使用哈希表實現的。


例如,


var numbers = {

"1": 1243213,

"2": 4314121,

"3": 3142123

...

}

然后,您可以通過檢查 if 來非??焖俚貦z查項目是否存在numbers["1"] === undefined。不僅如此,您還可以同時獲得房產的價值。


然而,這種方法確實有一些缺點,比如遍歷列表變得更加復雜(盡管仍然可能)。



查看完整回答
反對 回復 2021-10-14
  • 2 回答
  • 0 關注
  • 279 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號