修改后对JSON对象进行排序

时间:2015-03-07 16:26:30

标签: javascript json sorting

我目前正在开发一个项目,该项目根据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

2 个答案:

答案 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/