簡體   English   中英

如何優化JavaScript中嵌套對象的訪問成本?

[英]How to optimize accessing cost of nested objects in JavaScript?

我正在嘗試優化嵌套對象的訪問成本。 我具有以下結構(示例):

現在我想訪問數據,但是問題是我需要繼續添加每個嵌套數據的循環。 這意味着如果我要訪問機架,則需要對3這樣的循環進行加密

 var jsonObj=[{ "shelfs": [ { "Shelf1": [ { "Racks": [ { "Rack1": [ { "Book1": "Value" } ] }, { "Rack2": [ { "Book1": "Value" } ] } ] } ] }, { "Shelf2": [ { "Racks": [ { "Rack1": [ { "Book1": "Value" } ] }, { "Rack2": [ { "Book1": "Value" } ] } ] } ] } ] }]; for(var i=0;i<jsonObj.length;i++) { var shelfs=jsonObj[i]; var key=Object.keys(shelfs)[0]; //var shelfs=arr[arr[0].key]; //alert(JSON.stringify(shelfs[key]));//shelfs)); for(var j=0;j<shelfs[key].length;j++) { var shelfdetails=shelfs[key][j]; var skeys=Object.keys(shelfdetails); for(var k=0;k<skeys.length;k++) { var racks=shelfdetails[skeys[k]]; alert(JSON.stringify(racks)); } } } 

為了訪問機架信息,我在其中放入了3個嵌套的循環,但最終卻增加了時間復雜度。 請問有人可以建議我使用更好的數據結構或方法來訪問嵌套JavaScript對象,且時間復雜度低嗎?

您要在用戶界面中顯示n本書。 顯示n本書需要n個顯示操作。 它們處於嵌套循環中無關緊要,顯示操作的總數仍為n。 您無法執行優化以減少所需執行的顯示操作的數量。

即使將數據結構展平為一個單一的平整書本,顯示操作的數量仍為n。

我正在嘗試優化嵌套對象的訪問成本。

您是指CPU成本,存儲成本還是代碼復雜性成本? 這三者具有完全不同的含義。 既然你繼續說

無論何時我嵌套數據,我都需要繼續添加循環。

我將假設您對代碼復雜性最感興趣。 在這種情況下,請考慮以下更平坦的數據結構,使用下划線之類的實用程序庫,可能更容易遍歷,過濾,排序,分組和處理。

[
    { shelf: 'Shelf1', rack: 'Rack1', book: 'Book1', value: "Value"},       
    { shelf: 'Shelf1', rack: 'Rack2', book: 'Book1', value: "Value"},
    { shelf: 'Shelf2', rack: 'Rack1', book: 'Book1', value: "Value"},
    { shelf: 'Shelf2', rack: 'Rack2', book: 'Book1', value: "Value"}
]

抽象地說,每個"Book1": "Value"項目都與一個架子和架子相關聯。 在建議的數據結構中,此“關聯”由“屬於”關系表示,其中它屬於一個數組,該數組是名稱指定架子或機架的屬性的值。 在上述更扁平的結構中,通過將關聯指定為屬性來明確指定關聯。

使用更扁平的結構,如果您出於某種原因想要創建一個數據對象,而其鍵提供了架子,而值提供了該架子上的對象數組,那么在下划線中

_.groupBy(obj, 'shelf')

因此,在所有其他條件相同的情況下,平坦的數據結構似乎是表示數據的一種更靈活的方式,並且您可以更輕松地從中獲取需要的其他東西。

另一種看待它的方法是,當前要查找書架,架子和書本之間的關系集,您需要遍歷嵌套數組的三個級別,而在較平坦的結構中,關系可以更直接地表示。

不論是CPU還是空間,性能都很少成為選擇一種結構而不是另一種結構的原因,除非您要處理大量數據。 否則,性能差異很可能以毫秒或微秒或幾千個存儲量度。 您應該選擇一種結構,該結構允許您以簡潔且證明正確的方式表示算法。 如果打算處理成千上萬個對象,那么在這種情況下,您將需要設計針對時間或空間優化的自定義結構。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM