JSON对象中数据查找的设计模式

时间:2015-08-25 20:36:45

标签: angularjs design-patterns

所以编写一个使用大量用户生成数据的应用程序。在大多数情况下,我只是使用mongodb id查找它是什么。因此,此应用程序的典型示例是类别的图标。它们被存储为一个数据集,它从api传递到应用程序,从apongb到api到工厂再到控制器,我经常需要进行简单的查找。让我们说该类别如下:

[
   {
       "_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/

1 个答案:

答案 0 :(得分:0)

如果没有订购它们,并且您只想执行一次查找。那么你的算法是最好的方法。它需要o(n)才能完成,在最好的情况下采取一步(如果它是第一个图标)或n = icons.length则是最差的。

如果按ID排序,则可以尝试二进制搜索算法: https://en.wikipedia.org/wiki/Binary_search_algorithm

如果要对icons数组执行多次查找,那么最好的方法是创建一个id为属性,对象为value的对象:

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/