我目前正在开发一个项目,该项目根据JSON对象显示项目列表。我还希望能够根据对象项目中的字符串和整数对对象进行排序。
目前我设法让它们列出,并按字符串值和整数排序(使用纬度作为测试) - 我的排序功能很好。
这是我的JSON代码(适用于公园):
[
{
"name":"Greenhead Park",
"latitude":53.648748,
"longitude":-1.796985,
"image":"Greenhead_Park.jpg"
},
{
"name":"Shibden Park",
"latitude":53.730610,
"longitude":-1.838229,
"image":"Shibden_Park.jpg"
},
{
"name":"Beaumont Park",
"latitude":53.625146,
"longitude":-1.809171,
"image":"Beaumont_Park.jpg"
}
]
现在我的问题是我想按距离排序。正如您所看到的,JSON文件不包含距离'项目中的元素。目前我正在使用Google Maps API - 地理编码来计算用户位置和公园位置之间的距离。
在for循环中,我将新的距离元素添加到每个项目中:
parks[i]["distance"] = distance;
当我按距离对项目进行排序时,我正在控制台中记录JSON对象,以确保正在排序的对象肯定包含新添加的距离'。控制台显示:
所以看起来距离正好加入了对象。但是,当我在console.log(a.distance)时,它会以未定义的方式返回
所以我的问题是,一旦我为JSON对象中的每个项目添加了一个临时元素(在这种情况下'距离'),当我尝试引用它时,它会以未定义的形式返回 - 尽管事实上,当我在console.log对象时,它是明确定义的。
任何我错误的想法?任何帮助表示赞赏
编辑:对于那些询问' a'变量是,这里是对对象进行排序的函数
function sortParks(parks,sortMethod){
parks.sort(function(a, b){
console.log(parks);
console.log(a.name);
console.log(a.distance);
if(sortMethod == "az") return (a.name > b.name) ? 1 : (a.name < b.name) ? -1 : 0;
else if(sortMethod == "za") return (a.name < b.name) ? 1 : (a.name > b.name) ? -1 : 0;
else if(sortMethod == "dc") return a.distance - b.distance;
else if(sortMethod == "df") return b.distance - a.distance;
else alert("There was an issue identifying the sort type");
});
return parks;
}
不是&#39; a&#39;回归未定义,它是距离&#39;。当我的console.log(a.name)名称显示正常,当我在console.log(a.distance)时,它返回为undefined
答案 0 :(得分:1)
这是JS中的一个计算,你可以在不调用googles API的情况下使用它:
var earthRadius = 6371000; // meters
var latRad1 = lat1.toRadians();
var latRad2 = lat2.toRadians();
var latDiffRad = (lat2-lat1).toRadians();
var lonDiffRad = (lon2-lon1).toRadians();
var halfChordLen = Math.sin(latDiffRad/2) * Math.sin(latDiffRad/2) + Math.cos(latRad1) * Math.cos(latRad2) * Math.sin(lonDiffRad/2) * Math.sin(lonDiffRad/2);
var cur = 2 * Math.atan2(Math.sqrt(halfChordLen), Math.sqrt(1-halfChordLen));
var dist = earthRadius * cur;
答案 1 :(得分:0)
所以你的代码看起来像这样吗?
for(var i = 0; i < parks.length; i++) {
parks[i]["distance"] = calcDistance(parks[i].latitude, parks[i].longitude, user.latitude, user.longitude);
}
工作正常。那里什么都没有定义。这是一个更完整的例子。 https://jsfiddle.net/yhkzo95L/