2013-07-27 133 views
0

好的,所以我有一個對象的搜索結果數組,其中一個對象屬性值(顯示值)與搜索匹配。該陣列的結構如下,並且可以包含任意數量的不同的對象:如何創建對象的對象鍵的可變對象鍵?

results = [ 
    { 
     day: value, 
     time: value, 
     show: value, 
     sid: value, 
     network: value, 
     title: value, 
     ep: value, 
     link: value, 
    } 
]; 

我試圖將所有結果到一個大對象,合併任何日期或時間具有相同的價值。但是,我不能單純地看每一天或每個時間的價值。例如,如果星期二的晚上9點,我還需要保留星期一晚上9點。

要做到這一點,我想創建一個新的對象結構,像這樣:

for (var i=0; i<results.length; i++) { 
    var uniqtime = results[i]["time"]; 
    var uniqshow = results[i].show; 
    uniqresults[results[i].day] = { 
     uniqtime: { 
      uniqshow: { 
       sid: results[i].sid, 
       network: results[i].network, 
       title: results[i]["title"], 
       ep: results[i].ep, 
       link: results[i]["link"] 
      } 
     } 
    }; 
} 

但顯然這不會因爲變量子對象鍵名稱被視爲字符串工作。

如果我不是試圖創建變量子對象,如/鍵,以便:

for (var i=0; i<obj.length; i++) { 
    uniqresults[results[i].day] = {}; 
    uniqresults[results[i].day][results[i]["time"]] = {}; 
    uniqresults[results[i].day][results[i]["time"]][results[i].show] = { 
     sid: obj[i].sid, 
     network: results[i].network, 
     title: results[i]["title"], 
     ep: results[i].ep, 
     link: results[i]["link"] 
    }; 
} 

我確實可以創造適當的鍵名,但我不得不宣佈一個空物體來定義每個鍵(uniqresults[obj[i].day] = {} & uniqresults[obj[i].day][obj[i]["time"]] = {})。如果我不這樣聲明,它不會讓我插入我需要的其他子鍵/值。但是,像這樣聲明不允許我正確地合併結果數組,因爲每次讀取新的結果對象時,我基本上都會清空子鍵名稱!

也許我正在使這個比它應該更復雜。也許有更簡單的方法或方式強調或jQuery可以簡化我手頭的任務。無論如何,我現在非常渴望得到妥善的解決方案。

回答

2

看來你可以使用條件檢查時,redifining這些對象。

var day, time; 
for (var i=0; i<obj.length; i++) { 
    // Instantiate the day reference if it doesn't exist 
    day = uniqresults[results[i].day] = uniqresults[results[i].day] || {}; 

    // Instantiate the time reference if it doesn't exist 
    time = day[results[i].time] = day[results[i].time] || {}; 

    time[results[i].show] = { 
     sid: obj[i].sid, 
     network: results[i].network, 
     title: results[i]["title"], 
     ep: results[i].ep, 
     link: results[i]["link"] 
    }; 
} 

乾杯!

+0

很好地使用中間變量來避免長嵌套數組訪問。 – IMSoP

0

創建一個空的對象只有在對象的鍵不存在:

if(!(results[i].day in uniqresults)){ 
    uniqresults[results[i].day] = {}; 
} 

而對於子鍵等。

2

我不知道是否有更好的解決方案解決更廣泛的問題,但每次覆蓋子對象的問題都可以通過在創建子對象之前檢查它們是否已經存在來解決。在JS這樣做是使用||運營商,它不像大多數語言返回其評估爲true的說法

相對緊湊和慣用的方式,而不是一個簡單的布爾true

uniqresults[results[i].day] = uniqresults[results[i].day] || {}; 

第一次通過,uniqresults[results[i].day]將不確定,因此評估爲false,因此將分配{};然而,隨後,它將是一個評估爲真的對象,因此將簡單地將該變量分配給它自己,使其保持不變。