我正在创建一个 Javascript 应用程序(没有第三方框架或库),它需要从 JSON 对象获取位置列表并仅显示给定半径内的那些位置。我已经弄清楚如何确定位置的坐标是否在所需的半径内,但我无法弄清楚如何使用这些结果过滤对象。这是相关的代码:
function filterObj(obj) {
var radiusSize = 100;
return function filter() {
var result;
for (var i in obj) {
var lat = 41.8781;
var lon = 87.6298;
var coordinates = (obj[i].location.[0].coordinates).split(",");
lat2 = Number(coordinates[0]);
lon2 = Number(coordinates[1]);
result = toRadius(getDistance(lat, lon, lat2, lon2)) <= radiusSize;
}
return result;
};
}
function getObj() {
var xml = new XMLHttpRequest();
xml.onreadystatechange = function() {
if (xml.readyState === XMLHttpRequest.DONE) {
if (xml.readyState === 4 && xml.status === 200) {
obj = JSON.parse(xml.responseText);
var ObjFilter = filterObj(obj);
var filtered = obj.filter(objFilter);
displayLocations(filtered);
} else {
//code to handle errors
}
}
};
xml.open("GET", "/api/locations.json", true);
xml.send(null);
}
现在,我知道 filterObj() 由于 for 循环而反复为“result”返回“false”。我试图将 filterObj() 的结果存储为一个数组,但是“result”返回了几个包含“toRadius(getDistance())”结果的数组,我再次知道这是因为 for 循环,但是将“result”赋值移出循环会导致每个结果都是“false”,这是不正确的。
那么,在将该对象传递给“displayLocations()”之前,如何使用“toRadius(getDistance())”在“filterObj()”中生成的结果来过滤我在“getObj()”中获取的对象?
这是我正在使用的对象示例:
[
{
"id": 12,
"name": "Mount Helena City Park",
"location": [
{
"city": "Helena, MT",
"address": "Mount Helena City Park \nHelena, MT 59601",
"coordinates": "46.5889179,-112.0593352"
}
]
}
]
你的filterObject
函数(它返回一个过滤器函数)不应该得到obj
as 参数,因为这违背了这种柯里化函数的目的:它obj
会以任何方式逐个元素地传递给返回的函数,所以没有必要得到它经过这里。
而是利用这个机会通过所需的半径。然后返回的函数将使用它。
其次,返回的函数将获得一个元素值作为参数:您需要添加该参数并仅使用该值:那里的整个对象不应有循环:这是.filter
稍后要做的。
所以它可以像这样工作(为了清楚起见,我重命名了该函数):
function nearerThan(radiusSize = 100) {
return function filter(obj) {
var lat = 41.8781;
var lon = 87.6298;
var coordinates = (obj.location.[0].coordinates).split(",");
var lat2 = Number(coordinates[0]);
var lon2 = Number(coordinates[1]);
var result = toRadius(getDistance(lat, lon, lat2, lon2)) <= radiusSize;
return result;
};
}
function getObj() {
var xml = new XMLHttpRequest();
var nearerThan100 = nearerThan(100);
xml.onreadystatechange = function() {
if (xml.readyState === XMLHttpRequest.DONE) {
if (xml.readyState === 4 && xml.status === 200) {
obj = JSON.parse(xml.responseText);
var filtered = obj.filter(nearerThan100);
displayLocations(filtered);
} else {
//code to handle errors
}
}
};
xml.open("GET", "/api/locations.json", true);
xml.send(null);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句