如何按嵌套数组中对象的值对数组排序

杰米·布拉德利(Jamie Bradley)

我正在尝试订购一系列对象,在这种情况下为房屋,并且我正在尝试编写一个函数,使用户可以按地标的距离对房屋进行订购。假设我通过AJAX调用的API返回了以下数据:

"data" : [
    {
        'id' : 123,
        'address' : '12 street name',
        'city' : 'City Name',
        'landmarks' : [
            {
                'name' : 'landmark one',
                'distanceInMiles' : 0.6
            },
            {
                'name' : 'landmark two',
                'distanceInMiles' : 0.4
            }
        ]
    },
    {
        'id' : 345,
        'address' : '22 street name',
        'city' : 'City Name',
        'landmarks' : [
            {
                'name' : 'landmark one',
                'distanceInMiles' : 0.2
            },
            {
                'name' : 'landmark three',
                'distanceInMiles' : 0.1
            }
        ]
    },
    {
        'id' : 456,
        'address' : '28 street name',
        'city' : 'City Name',
        'landmarks' : [
            {
                'name' : 'landmark six',
                'distanceInMiles' : 8.2
            },
            {
                'name' : 'landmark seven',
                'distanceInMiles' : 1.6
            }
        ]
    }
]

我已经有一些代码可以返回包含特定地标的房屋,例如,过滤此数组以返回具有地标“地标1”的房屋,然后将过滤后的数据存储到单独的数组中。但是我现在想更进一步,并根据distanceInMiles所选地标的值对过滤后的结果数组进行排序

因此,在这种情况下,我尝试编写一些代码,这些代码将首先返回地址为“ 22街道名称”的两所房子,然后返回地址为“ 12街道名称”的那所房子,因为“ 22街道名称”的房子更近了比另一个具有里程碑意义。

我正在使用_loadash作为实用程序库,但努力了解如何按“具有里程碑意义的”距离对过滤后的数组进行排序。有任何想法吗?

任何帮助将不胜感激。

约书亚·古萨德(Joshua Cousard)

var data = [
 {
  "id" : 123,
  "address" : "12 street name",
  "city" : "City Name",
  "landmarks" : [
   {
    "name" : "landmark one",
    "distanceInMiles" : 0.6
   },
   {
    "name" : "landmark two",
    "distanceInMiles" : 0.4
   }
  ]
 },
 {
  "id" : 345,
  "address" : "22 street name",
  "city" : "City Name",
  "landmarks" : [
   {
    "name" : "landmark one",
    "distanceInMiles" : 0.2
   },
   {
    "name" : "landmark three",
    "distanceInMiles" : 0.1
   }
  ]
 },
 {
  "id" : 456,
  "address" : "28 street name",
  "city" : "City Name",
  "landmarks" : [
   {
    "name" : "landmark six",
    "distanceInMiles" : 8.2
   },
   {
    "name" : "landmark seven",
    "distanceInMiles" : 1.6
   }
  ]
 }
];

function sortByLandmarkDistance(name) {
    var getDistance = function(house) {
        var minDistance = Infinity;

        for(var i = 0; i < house.landmarks.length; ++i)
            if(house.landmarks[i].name === name)
            	minDistance = Math.min(minDistance, house.landmarks[i].distanceInMiles);

        return minDistance;
    };

    return data.sort(function(a, b) {
		return getDistance(a) - getDistance(b);
    });
}
    
// Sort houses by distance from 'landmark one'
var sorted = sortByLandmarkDistance('landmark one');
document.body.innerHTML = '<pre>' + JSON.stringify(sorted, null, '    ') + '</pre>';

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章