所以编写一个使用大量用户生成数据的应用程序。在大多数情况下,我只是使用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。
答案 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/