2015-08-25 48 views
0

因此編寫一個使用大量用戶生成數據的應用程序。在大多數情況下,我只是使用mongodb id來查找它是什麼。所以這個應用程序的典型例子是類別的圖標。它們被存儲爲一個數據集,它通過應用程序從api傳遞給mongodb,然後傳遞給api,然後傳遞給控制器​​,而且我經常需要做一個簡單的查找。假設類別如下所示:用於在JSON對象中進行數據查找的設計模式

[ 
    { 
     "_id":"55dc79efed0fcf4a58d4a68d", 
     "categoryName":"Sport", 
     "categoryDescription":"Sport and more sports", 
     "categoryIcon":"55dc79b2ed0fcf4a58d4a68c", 
     "__v":0 
    } 
] 

categoryIcon是另一個表的引用,在工廠加載時,數據如下所示。

[ 
    { 
     "_id":"55dc79b2ed0fcf4a58d4a68c", 
     "iconName":"Sport", 
     "cssString":"fa fa-futbol-o", 
     "__v":0 
    }, 
    { 
     "_id":"55dc79b2ed0fcf4a58d4a69d", 
     "iconName":"Travel", 
     "cssString": 
     "fa fa-plane", 
     "__v":0 
    } 
] 

所以我一直在解決這個的方法是沿

for (var i in icons){ 
    if(icons[i]._id == category.categoryIcon){ 
     console.log("Found the Icon"); 
     category.cssString=icons[i].cssString; 
    } 
} 

容易,比較快的線條,但似乎有點浪費,所以是有一個平滑的方式。如果有人想測試,做一個簡單的jfiddle。

https://jsfiddle.net/vrghost/9tw4btyo/1/

回答

0

如果他們不下令,你要執行只有一個查找。那麼你的算法是最好的選擇。它需要o(n)完成,在最好的情況下(如果它是第一個圖標)採取1步,或者在最差的情況下n = icons.length。

如果它們被編號排序,那麼你可以嘗試一個二進制搜索算法: https://en.wikipedia.org/wiki/Binary_search_algorithm

如果你想圖標陣列上執行多個查詢,然後以最好的方式是創建一個對象id作爲屬性和對象的值:

var iconObject = (function(icons) { 
    var value = {}; 
    for (var i in icons){ 
     value[icons[i]._id] = icons[i]; 
    }   
    return value; 
})(icons); 

$scope.category.cssString = iconObject[$scope.category.categoryIcon].cssString; 

https://jsfiddle.net/80g5gg3k/1/

編輯:

如果您有機會更改API,則直接返回數據作爲對象而不是數組(如果它不殺死您的RESTful方法)。這樣你就不必預處理它。返回類似:

{ 
    "55dc79b2ed0fcf4a58d4a68c": { 
     "_id":"55dc79b2ed0fcf4a58d4a68c", 
     "iconName":"Sport", 
     "cssString":"fa fa-futbol-o", 
     "__v":0 
    }, 
    "55dc79b2ed0fcf4a58d4a69d":{ 
     "_id":"55dc79b2ed0fcf4a58d4a69d", 
     "iconName":"Travel", 
     "cssString": 
     "fa fa-plane", 
     "__v":0 
    } 
} 

樣品搗鼓這最後的辦法: https://jsfiddle.net/5jvxusjw/1/

+0

所以按照你的答案中,選擇是要麼花費大量的時間faffing有關訂購你的清單,並從發送前重建數據API,或者只是用for循環。 (當我閱讀我的答案時,我意識到這聽起來有點粗魯,這不是我的意圖,我非常感謝您的回答,並且我希望討論進行:)) – vrghost

+0

我已更新答案以反映替代方法,如果您可以改變API。 –