的阵列中的结果
我正在尝试过滤并计算给定原点10公里以内的API端点的对象。我一直坚持如何过滤API结果并计算匹配的项目数量。
我能够过滤数据并计算有1-1比较的"香港"城市有多少个项目,但是距离计算是过滤数据的另一个复杂层。
coords = [
[
City: "Hong Kong",
Lat: “22.667790”,
Long: “-111.909905”
],
[
City: "Atlanta",
Lat: “22.958769”,
Long: “-111.948939”
],
[
City: "Paris",
Lat: “23.989803”,
Long: “-112.989850”
],
[
City: "Sydney",
Lat: “22.001118”,
Long:”-111.939433”
],
[
City: "Hong Kong",
Lat: “22.667790”,
Long: “-111.909905”
],
];
origin = [
lat:"22.111009",
long: "-113.667870"
];
function getDistance(lat1, lon1, lat2, lon2) {
var R = 6371; // Radius of the earth in km
var dLat = deg2rad(lat2 - lat1); // deg2rad below
var dLon = deg2rad(lon2 - lon1);
var a =
Math.sin(dLat / 2) * Math.sin(dLat / 2) +
Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) *
Math.sin(dLon / 2) * Math.sin(dLon / 2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
var d = R * c; // Distance in km
return d;
}
function deg2rad(deg) {
return deg * (Math.PI / 180);
}
coords.forEach(function(coord){
distance = getDistance(coord.lat, coord.long, origin.lat, origin.long);
if (distance < 10){
return distance;
}
});
到目前为止,我无法返回任何有意义的东西,只有原点与每个对象之间的距离列表。它应该显示出来源10公里的城市。
您需要使用filter
方法:
const filtered = coords.filter(coord => {
distance = getDistance(coord.lat, coord.long, origin.lat, origin.long);
return distance < 10
});
现在,您已经过滤了存储在名为filtered
要过滤您的列表,您可以使用array.filter。当然,您的起源应少于10公里,而您的城市都不匹配,请参阅:
var coords = [{
City: "Hong Kong",
lat: "22.667790",
long: "-111.909905"
},
{
City: "Atlanta",
lat: "22.958769",
long: "-111.948939"
},
{
City: "Paris",
lat: "23.989803",
long: "-112.989850"
},
{
City: "Sydney",
lat: "22.001118",
long: "-111.939433"
},
{
City: "Hong Kong",
lat: "22.667790",
long: "-111.909905"
}
];
origin = {
lat: "22.611009",
long: "-111.967870"
};
function getDistance(lat1, lon1, lat2, lon2) {
var R = 6371; // Radius of the earth in km
var dLat = deg2rad(lat2 - lat1); // deg2rad below
var dLon = deg2rad(lon2 - lon1);
var a =
Math.sin(dLat / 2) * Math.sin(dLat / 2) +
Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) *
Math.sin(dLon / 2) * Math.sin(dLon / 2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
var d = R * c; // Distance in km
return d;
}
function deg2rad(deg) {
return deg * (Math.PI / 180);
}
var matching = coords.filter(function(coord) {
return getDistance(coord.lat, coord.long, origin.lat, origin.long) < 10;
});
console.info(matching);