2015-08-08 65 views
-2

我想筛选具有相同flight_date,departure_at,'arrival_at','from','至','price'的项目。如何过滤具有多个条件的对象的排列

否则,我会保持历时一个(通过updated_at字段)。

我怎么能做到这一点与红宝石

原始阵列

[ 
{ 
    "_id": ObjectId("55c553af506f6325ef000005"), 
    "flight_date": new Date("2015-08-13T08:00:00+0800"), 
    "departure_at": new Date("2015-08-13T19:35:00+0800"), 
    "arrival_at": new Date("2015-08-13T23:15:00+0800"), 
    "from": "KHH", 
    "to": "KIX", 
    "updated_at": new Date(1438995375908), 
    "price": 3898 
}, 
... 
{ 
    "_id": ObjectId("55c553af506f6325ef000009"), 
    "flight_date": new Date("2015-08-13T08:00:00+0800"), 
    "departure_at": new Date("2015-08-13T19:35:00+0800"), 
    "arrival_at": new Date("2015-08-13T23:15:00+0800"), 
    "from": "KHH", 
    "to": "KIX", 
    "updated_at": new Date(1438995375999), 
    "price": 3898 
} 
] 

预计输出数组

[ 
    { 
     "_id": ObjectId("55c553af506f6325ef000005"), 
     "flight_date": new Date("2015-08-13T08:00:00+0800"), 
     "departure_at": new Date("2015-08-13T19:35:00+0800"), 
     "arrival_at": new Date("2015-08-13T23:15:00+0800"), 
     "from": "KHH", 
     "to": "KIX", 
     "updated_at": new Date(1438995375999), 
     "price": 3898 
    } 
] 
+1

那甚至不是一个ruby数组 - 在Ruby中从来没有见过类似'new Date(...)'的代码。你的代码不能在Ruby中编译。 –

回答

2

我的理解是,只要哈希的数组,你要组哈希值h由数组的值:

[h[:flight_date], h[:departure_at], h[:arrival_at], 
    h[:from], h[:to], h[:price]] 

以及每个组内您想要保留哪一个最大的为h[:updated_at]。如果这是正确的,这是一种方式做到这一点,利用Enumerable#group_by

def filter_flights(arr) 
    arr.group_by { |h| [h[:flight_date], h[:departure_at], h[:arrival_at], 
    h[:from], h[:to], h[:price]] }. 
    values. 
    map { |a| a.max_by { |h| h[:updated_at] } } 
end 

你的哈希值的阵列不能直接使用,所以我已经简化它。

arr = [ 
{ 
    "_id": "55c553af506f6325ef000005", 
    "flight_date": "2015-08-13T08:00:00+0800", 
    "departure_at": "2015-08-13T19:35:00+0800", 
    "arrival_at": "2015-08-13T23:15:00+0800", 
    "from": "KHH", 
    "to": "KIX", 
    "updated_at": 1438995375908, 
    "price": 3898 
}, 
{ 
    "_id": "55c553af506f6325ef000009", 
    "flight_date": "2015-08-13T08:00:00+0800", 
    "departure_at": "2015-08-13T19:35:00+0800", 
    "arrival_at": "2015-08-13T23:15:00+0800", 
    "from": "KHH", 
    "to": "KIX", 
    "updated_at": 1438995375999, 
    "price": 3898 
} 
] 

filter_flights(arr) 
    #=> [{:_id=>"55c553af506f6325ef000005", 
    #  :flight_date=>"2015-08-13T08:00:00+0800", 
    #  :departure_at=>"2015-08-13T19:35:00+0800", 
    #  :arrival_at=>"2015-08-13T23:15:00+0800", 
    #  :from=>"KHH", 
    #  :to=>"KIX", 
    #  :updated_at=>1438995375999, 
    #  :price=>3898}] 

替代

每当一个问题,可以使用Enumerable#group_by可以解决,你可以肯定的是有另一种方式(这是通常一样好)使用Hash#update(又名merge!)。在这里它是:

def filter_flights(arr) 
    arr.each_with_object({}) do |g,h| 
    a = [g[:flight_date], g[:departure_at], g[:arrival_at], 
     g[:from], g[:to], g[:price]] 
    h.update(a=>g) { |_,o,n| (o[:updated_at] >= n[:updated_at]) ? o : n } 
end.values 

在这里,我使用的Hash#update使用一个块,以确定存在于被合并(两个散列是所述块变量的值都散列密钥的值的形式on)。