Ruby Array Condition



如何将电影存储到新数组中,如果评级大于3?

movies = [
{
"id" => 70111470,
"title" => "Die Hard",
"boxart" => "http://cdn-0.nflximg.com/images/2891/DieHard.jpg",
"uri" => "http://api.netflix.com/catalog/titles/movies/70111470",
"rating" => 5.0,
"bookmark" => []
},
{
"id" => 654356453,
"title" => "Bad Boys",
"boxart" => "http://cdn-0.nflximg.com/images/2891/BadBoys.jpg",
"uri" => "http://api.netflix.com/catalog/titles/movies/70111470",
"rating" => 2.0,
"bookmark" => [{ "id" => 432534, "time" => 65876586 }]
}
]

结果应该只给我标题和boxart。

[
{
"title"=>"Die Hard",
"boxart"=>"http://cdn-0.nflximg.com/images/2891/DieHard.jpg"
}
]

Ruby数组有两个方法可以用来实现你想要的:selectmap

select函数接受一个块并返回该块返回true的元素。https://apidock.com/ruby/Array/select

map函数接受一个块并创建一个新数组,其中原数组中的每个元素都映射到新数组中的新元素/对象https://apidock.com/ruby/Array/map

movies = [
{
"id" => 70111470,
"title" => "Die Hard",
"boxart" => "http://cdn-0.nflximg.com/images/2891/DieHard.jpg",
"uri" => "http://api.netflix.com/catalog/titles/movies/70111470",
"rating" => 5.0,
"bookmark" => []
},
{
"id" => 654356453,
"title" => "Bad Boys",
"boxart" => "http://cdn-0.nflximg.com/images/2891/BadBoys.jpg",
"uri" => "http://api.netflix.com/catalog/titles/movies/70111470",
"rating" => 2.0,
"bookmark" => [{ "id" => 432534, "time" => 65876586 }]
}
]

p movies.select { |m|
m["rating"] > 3.0
}.map { |m| 
{
"title" => m["title"],
"boxart" => m["boxart"]
}
}

在上面的代码中,我首先使用select函数只选择评级大于3的电影。获得该数组后,然后使用map函数创建一个新数组,其中仅包含上面提到的字段。

您也可以通过将中间结果存储在临时变量

中来编写相同的代码。
movies = [
{
"id" => 70111470,
"title" => "Die Hard",
"boxart" => "http://cdn-0.nflximg.com/images/2891/DieHard.jpg",
"uri" => "http://api.netflix.com/catalog/titles/movies/70111470",
"rating" => 5.0,
"bookmark" => []
},
{
"id" => 654356453,
"title" => "Bad Boys",
"boxart" => "http://cdn-0.nflximg.com/images/2891/BadBoys.jpg",
"uri" => "http://api.netflix.com/catalog/titles/movies/70111470",
"rating" => 2.0,
"bookmark" => [{ "id" => 432534, "time" => 65876586 }]
}
]

movies_with_high_rating = movies.select { |m|
m["rating"] > 3.0
}
result = movies_with_high_rating.map { |m| 
{
"title" => m["title"],
"boxart" => m["boxart"]
}
}
p result

有两种简单的方法:

  • 首先你可以使用collect来为变量分配块作用域值:

    result_array = movies.collect { |movie| { title: movie['title'], boxart: movie['boxart'] } if movie['rating'] > 3 }.compact

  • 第二种方法是使用数组实例化变量并在块内推送值:

    result_array = []

    movies.each {|movie| result_array << { title: movie['title'], boxart: movie['boxart'] } if movie['rating'] > 3 }

使用filter_map (Ruby 2.7+)。而不是单独的映射和选择,您可以节省相关的时间使用浪费的映射计算和对集合的第二次迭代。

movies.filter_map do |movie|
if movie['rating'] > 3
{title:  movie['title'],
boxart: movie['boxart'] }
end
end

最新更新