如何将电影存储到新数组中,如果评级大于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数组有两个方法可以用来实现你想要的:select
和map
。
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