Удалить элемент из массива хэшей Ruby, если элемент соответствует массиву строк - PullRequest
0 голосов
/ 30 августа 2018

У меня есть список строк в массиве, как ...

playlist_track_names = ["I Might", "Me & You", "Day 1", "I Got You (feat. Nana Rogues)", "Feels So Good (feat. Anna of the North)", "306", "Location Unknown (feat. Georgia)", "Crying Over You (feat. BEKA)", "Shrink", "I Just Wanna Go Back", "Sometimes", "Forget Me Not"] 

Тогда у меня есть массив хэшей, например ...

[
  {"id"=>"1426036284", "type"=>"songs", "attributes"=>{"name"=>"I Might", "albumName"=>"Love Me / Love Me Not" },
  {"id"=>"1426036285", "type"=>"songs", "attributes"=>{"name"=>"Feels So Good (feat. Anna of the North)", "albumName"=>"Love Me / Love Me Not" },
  {"id"=>"1426036286", "type"=>"songs", "attributes"=>{"name"=>"Forget Me Not", "albumName"=>"Love Me / Love Me Not" },
  {"id"=>"1426036287", "type"=>"songs", "attributes"=>{"name"=>"Some Other Name", "albumName"=>"Love Me / Love Me Not" }
]

Я хочу удалить любой элемент из массива хэшей, где attributes['name'] соответствует любому из имен в массиве playlist_track_names.

Как бы я это сделал?

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Вы можете использовать Array#delete_if, чтобы удалить любые записи, которые соответствуют блоку. В блоке используйте Array#include?, чтобы проверить, есть ли название трека в списке.

tracks.delete_if { |track|
  playlist_track_names.include? track["attributes"]["name"]
}

Обратите внимание, что, поскольку playlist_track_names.include? должен искать по playlist_track_names один за другим, это будет медленнее по мере увеличения playlist_track_names. Вы можете избежать этого, используя Set .

require 'set'

playlist_track_names = ["I Might", "Me & You", ...].to_set

Набор подобен хэшу только с ключами, без значений. Это неупорядоченный набор уникальных значений, которые очень быстро найти. playlist_track_names.include? в наборе будет работать одинаково, независимо от размера playlist_track_names.

0 голосов
/ 30 августа 2018

Похоже, в вашем hash_list отсутствуют закрывающие скобки Я добавил их ниже. Попробуйте запустить это в irb:

playlist_track_names = ["I Might", "Me & You", "Day 1", "I Got You (feat. Nana Rogues)", "Feels So Good (feat. Anna of the North)", "306", "Location Unknown (feat. Georgia)", "Crying Over You (feat. BEKA)", "Shrink", "I Just Wanna Go Back", "Sometimes", "Forget Me Not"] 

hash_list = [
  {"id"=>"1426036284", "type"=>"songs", "attributes"=>{"name"=>"I Might", "albumName"=>"Love Me / Love Me Not" } },
  {"id"=>"1426036285", "type"=>"songs", "attributes"=>{"name"=>"Feels So Good (feat. Anna of the North)", "albumName"=>"Love Me / Love Me Not" } },
  {"id"=>"1426036286", "type"=>"songs", "attributes"=>{"name"=>"Forget Me Not", "albumName"=>"Love Me / Love Me Not" } },
  {"id"=>"1426036287", "type"=>"songs", "attributes"=>{"name"=>"Some Other Name", "albumName"=>"Love Me / Love Me Not" } }
]

hash_list.delete_if { |i| playlist_track_names.include? i["attributes"]["name"] }
puts hash_list
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...