typescript排序 - javascript key排序



對像數組與對像對象 (4)

在服務器端,數組存儲為簡單列表: ArrayList<Content> ,而對象存儲為映射: HashMap<String, Content>或主要作為Java對象。

為了將Java實體轉換為JSON,您可以查看Jackson項目,它可以為您完成所有這些工作。

我不擔心這兩個變體之間的性能差異。 擁有一個可理解的語義API更為重要,因此您應該根據業務案例而不是績效來確定您的理念。

看看你的例子,我認為Array是更好的方法,因為你想返回一個完全相同的用戶列表。 發送id兩次毫無意義,並增加了必須傳輸的數據量。

此外,由於Arrays在Java中的存儲和迭代更加簡單,因此它們也應該提供比Objects更好的性能。

一些一般差異:

  • 數組保留了順序
  • 數組可以包含重複的條目
  • 對象通常具有更大的存儲/網絡開銷
  • 數組的迭代速度更快(在服務器端)

問題是決定以下符號之間的權衡:

基於JSON

"users": {
    "id1": {
        "id": "id1",
        "firstname": "firstname1",
        "lastname": "lastname1"
    },
    "id2": {
        "id": "id2",
        "firstaame": "firstname2",
        "lastname": "lastname2"
    }
}

基於數組

users: [
    {
        "id": "id",
        "key2": "value2",
        "key3": "value3"
    },
    {
        "id": "id",
        "key2": "value2",
        "key3": "value3"
    }
]

關於同一問題的this文章,我決定(在前端)使用JSON對象表示法而不是對像數組,因為它符合我的要求,並且在瀏覽器中具有更好的性能和更少的代碼。

但問題是列表本身並不是靜態的。 我的意思是生成列表,即從DB(NoSQL)獲取/存儲,並通過服務器上的Java API為新條目創建。 我無法決定我應該在後端使用哪種表示法(最終也會影響用戶界面)。

任何關於性能,可維護性或可擴展性的想法/建議都表示讚賞。


您可以使用object[property] notation來訪問或設置JavaScript中對象的屬性。

在後端使用基於數組的方法,並將數組轉換為前端中的地圖( 基於JSON )。

var list = [{id: "id1", value: "One"}, {id: "id2", value: "Two"}]
var map = {};
list.forEach(function (item) { map[item.id] = item });
map.get("id1")

如果列表發生更改,您可以從後端獲取新列表並在UI中更新地圖。

這樣,您的後端響應速度更快,因為它不必將列表轉換為地圖。 您的前端將在列表上執行一次O(n)迭代,以將其轉換為地圖。 但是,與O(n)相比,這是一個很小的價格,您每次搜索列表時都會支付。

如果您將主要使用後端數據來獲取id,請在後端使用JSON Based (您可以使用LinkedHashMap來保留順序)。


這兩種方法都有其優點和缺點,取決於你正在看什麼。

數組方法很容易序列化,並且更加“框架”友好(您可以將bean添加到列表中并序列化列表,您就完成了)。 例如,這允許Web容器返迴響應而無需任何自定義。 這可能是大多數框架開箱即用的支持。

另一方面,基於對象的方法更難以生成(相對而言),但是在密鑰已知的情況下更容易查找。

因此,為了便於實現(由生產者),請採用基於陣列的方法。 為了便於使用(由客戶使用),請選擇基於對象的方法。


這是一個基於意見的總問題。 可能還有很多其他問題,但我可以在下面指出。

基於JSON的方法:如果我沒有錯,那麼這將使用服務器端的Map實現。

優點:在JavaScript中,您可以直接使用users.id1,users.id2,即無需迭代

缺點:在客戶端,有些人會如何要求你的JSON中存在的id,即硬編碼或者使用一些動態方法來告訴你JSON中存在哪個id。

基於數組的方法:如果我沒有錯,那麼這將使用服務器端的Array / List實現。

優點:

  1. 在客戶端,您可以直接遍歷數組,而無需事先擔心其中存在哪個ID,即沒有硬編碼。
  2. 正如@JBNizet指出的那樣 ,基於數組的方法將維持秩序。

缺點:如果要獲取單個ID,則需要遍歷數組。

通常我們不會在客戶端發送太多信息,因此基於數組的方法不會產生任何問題。 如果你想要基於id的方法,那麼在一邊(服務器和客戶端)可以將數組轉換成map





maintainability