如何按值对动态创建的JavaScript对象进行排序?

时间:2013-05-20 18:13:00

标签: javascript jquery sorting

我有一个JavaScript对象,我使用.push()添加,但问题是当我将数据推送到对象时,对象不再按时间值排序。我怎样才能创建这个相同的对象,但始终按照time_going_hour然后按time_going_minutes进行排序?

"days": {
    "1": {
        "places": [{
            "url": "/attraction/mauna-kea-summit/19",
                "img_src": "http://trekeffect.images.user_images.s3.amazonaws.com/4_36.jpg",
                "title": "Mauna Kea Summit",
                "time_going_hour": 1,
                "time_going_minutes": 55,
                "duration": "3600",
                "id": 19,
                "type": "attraction",
                "city_id": 6
        }, {
            "url": "/attraction/the-st.-benedict-painted-church/21",
                "img_src": "http://trekeffect.images.user_images.s3.amazonaws.com/4_42.jpg",
                "title": "The St. Benedict Painted Church",
                "time_going_hour": 8,
                "time_going_minutes": 35,
                "duration": "2600",
                "id": 21,
                "type": "attraction",
                "city_id": 6
        }, {
            "url": "/attraction/mauna-kea-summit/19",
                "img_src": "http://trekeffect.images.user_images.s3.amazonaws.com/4_36.jpg",
                "title": "Mauna Kea Summit",
                "time_going_hour": 3,
                "time_going_minutes": 51,
                "duration": "3600",
                "id": 19,
                "type": "attraction",
                "city_id": 6
        }]
    }

2 个答案:

答案 0 :(得分:5)

尝试

places.sort(function(x, y) {
   return x.time_going_hour - y.time_going_hour || 
          x.time_going_minutes - y.time_going_minutes
})

Array.sort接受比较功能。比较函数有两个参数(这里是xy)并返回一个结果:

  • 大于0(如果x > y),
  • 小于0(如果x < y)或
  • 完全为0(如果x == y)。

此比较函数首先尝试返回x小时和y小时的差异(如果x的小时大于{{小时} 1}},差异是正面的,否则它是负面的)。如果小时值相等,则小时差为0,并且评估“或”(y)的右侧部分(因为在布尔上下文中计算的||是{{1 }})。这个右手表达式执行与之前相同的比较,但是使用分钟而不是几小时。

简而言之,比较函数按小时对值进行排序,如果任何给定元素的小时数相同,则按分钟对它们进行子排序。

答案 1 :(得分:1)

你可以使用javascript sort方法在添加/推送之后对数组进行排序。

sort(function(a,b){
return (a["time_going_hour"]*60+a["time_going_mnutes"]) - (b["time_going_hour"]*60+b["time_going_mnutes"])
})

places数组

上应用此功能