2011-04-27 57 views
1

我有一個這樣的JSON對象在我的申請:JSON:如何處理從密鑰派生的屬性?

var pages = { 
    home: { 
     title: "Home", 
     description: "The home page", 
     file: "home.html", 
     url: "/home" 
    }, 
    blog: { 
     title: "Blog", 
     description: "Our blog", 
     file: "blog.html", 
     url: "/blog" 
    } 
}; 

性質fileurl總是可以從相應的密鑰導出的,所以目前限定上述目的這樣在我的代碼:

var pages = { 
    home: { 
     title: "Home", 
     description: "The home page" 
    }, 
    blog: { 
     title: "Blog", 
     description: "Our blog" 
    } 
}; 

$.each(pages, function(key, value) { 
    value.file = key + ".html"; 
    value.url = "/" + key; 
} 

但是,由於fileurl是派生屬性,所以將它們添加到對象似乎是多餘的。但因爲我傳遞值周圍的每一頁,不是關鍵,我必須將它添加到對象爲好,這也將是多餘的。像這樣:

var pages = { 
    home: { 
     title: "Home", 
     description: "The home page" 
    }, 
    blog: { 
     title: "Blog", 
     description: "Our blog" 
    } 
}; 

$.each(pages, function(key, value) { 
    value.jsonKey = key; 
} 

現在我有三種不同的方法,並不真的喜歡其中的任何一種。我認爲這應該是一個相當普遍的問題,那麼你如何解決這個問題呢?那麼如果派生屬性將被多次使用呢?

回答

1

,你應該考慮將網頁作爲對象的列表,而不是與屬性的對象。這似乎在邏輯上更一致,並解決您的冗餘問題。

var pages = [ 
    { 
     key: 'home' 
     title: "Home", 
     description: "The home page", 
    }, 
    { 
     key: 'blog', 
     title: "Blog", 
     description: "Our blog", 
    } 
]; 

另外。你可以創建頁面對象和計算派生屬性使用方法的類(可選緩存他們,如果你想重複訪問是昂貴的。然而,這樣做簡單的字符串連接似乎矯枉過正)

+0

我沒有注意到這一點,但我實際上需要根據他們的密鑰訪問頁面。實際上基於它們的URL而不是前導「/」,這等於密鑰。 – futlib 2011-04-28 06:23:29

+0

AFAIK沒有* *優雅的方式來訪問從對象鍵不重複的頁面對象的關鍵。這些鍵不是單個頁面對象的一部分。注意:您還可以找到自己的解決方案通過按鍵頁(你只需要在列表中搜索着,當然,這將是比對象屬性訪問速度較慢)。 – z33m 2011-04-28 12:18:25

0

你想在同一數據存儲在不同的形式,當你已經擁有它的一種形式(您的鑰匙)爲什麼。
在我看來,不要去任何這些,因爲無論何時您希望獲得特定頁面的fileurl,都可以從page.key輕鬆獲得。

+0

但我應該如何訪問鑰匙?考慮我調用someFunction(pages [「home」]),someFunction將只能訪問頁面對象。我寧願在值中重複鍵,而不是將它傳遞給每個與頁面一起工作的函數。 – futlib 2011-04-28 06:32:37