我正在构建一个Angular应用程序,它通过500px API搜索地理位置,并根据搜索返回照片。如果有人多次搜索同一位置,我需要在API请求中增加对page=x
的搜索,以便返回新的结果。
我目前处理此问题的方法是在Firebase中查询我的所有locations
,并使用Undescore.js _findWhere
功能对其进行过滤。如果位置名称与搜索的术语匹配,我会增加它,否则我会创建一个新的。
目前我有它工作,以便在匹配时返回我的对象,但为了增加它,我需要Firebase分配给它的该对象的唯一ID。
这是我的代码(从CoffeeScript转换而来;道歉):
getSearchCount = function(result) {
var data;
// fetch the data from firebase as an object
data = $firebase(ref).$asObject();
return data.$loaded().then(function() {
var passed_data, plucked_result;
// search the object to see if a location matches the currently searched term
plucked_result = _.findWhere(data.locations, {
name: result.formattedAddress
});
// this is where I want to return the unique ID of the plucked result
return passed_data = [result, plucked_result];
});
};
saveLocation = function(passed_data) {
var plucked_result, result, search_count;
result = passed_data[0];
plucked_result = passed_data[1];
// if the search term doesn't exist, create a new one
if (plucked_result === null) {
search_count = 1;
return locationsRef.push({
name: result.formattedAddress,
lat: result.lat,
lng: result.lng,
search_count: search_count
});
} else {
// increment the search count on the query
// search_count = plucked_result.search_count + 1
// plucked_result.search_count = search_count
}
};
这是我为console.log(数据)返回的对象:
d {$$conf: Object, $id: null, $priority: null, foo: "bar", locations: Object…}
$$conf: Object
$id: null
$priority: null
locations: Object
-JUBNhmr_0kwSmHLw4FF: Object
lat: 51.5073509
lng: -0.12775829999998223
name: "London, UK"
search_count: 1
__proto__: Object
-JUBQREGJpQnXxiMIaKm: Object
lat: 48.856614
lng: 2.3522219000000177
name: "Paris, France"
search_count: 1
__proto__: Object
__proto__: Object
photos: Object
__proto__: Object
这是我正在为console.log(plucked_result)返回的对象:
Object {lat: 51.5073509, lng: -0.12775829999998223, name: "London, UK", search_count: 1}
总而言之,我想要Firebase唯一ID(-JUBNhmr_0kwSmHLw4FF)。
或许我是以一种可以简化的完全复杂的方式做到这一点的?所有我基本上都需要这样做创建一种分页我的API请求的方式,这样我就不会把所有相同的结果页面拉两次。
答案 0 :(得分:2)
简短回答:
您可以使用以下循环替换underscore.js findWhere()
调用:
var key;
var location;
for(key in data.locations) {
location = data.locations[key];
if(location.name == result.formattedAddress) {
break;
}
}
这会将您感兴趣的对象存储在location
中,并将其名称存储在key
中。
为何会出现这种情况
您正在寻找的唯一ID(Firebase文档称之为对象名称)是您的firebase中您的位置对象的父级。 data.locations
中的一个对象可能看起来像这样:
{ '-JUBNhmr_0kwSmHLw4FF' :
{ lat: 51.5073509, lng: -0.12775829999998223,
name: "London, UK", search_count: 1 }
}
并且findWhere()
函数可以找到它,但它只返回匹配的对象,并且没有提供一种方法来升级树,以获得父节点。