【发布时间】:2018-02-04 15:02:45
【问题描述】:
我正在创建一个 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);
}
现在,我知道由于 for 循环,filterObj() 反复为“result”返回“false”。我试图将 filterObj() 的结果存储为一个数组,但随后“result”返回了几个包含“toRadius(getDistance())”结果的数组,我再次知道这是因为 for 循环,但是将“结果”赋值移出循环会导致每个结果都为“假”,这是不正确的。
那么,在将对象传递给“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"
}
]
}
]
【问题讨论】:
-
我认为你让这变得比它需要的更难了。请发布您返回的数据的结构,我认为我们将能够帮助使代码以更清洁的方式工作。
-
lat, lon, lat2, lon2来自哪里?就像你现在的代码一样,它们是未定义的。 -
如果
JSON.parse(xml.responseText)的值是您所期望的,那么getObj与此处无关 -
@ChristopherMesser 我不会感到惊讶。我在帖子中添加了我的对象示例。
-
@trincot 很抱歉。我已经编辑了帖子并将它们添加回来。
标签: javascript for-loop filter javascript-objects