-1
votes

Pousser des objets dans un hachage à l'intérieur d'une boucle

J'essaie d'atteindre les résultats JSON suivants:

@results = Hash.new
results['Search'].each do |r|
  if r['Type'] == 'movie'
    @results['movie'] << {
        'title' => r['Title'],
        'year' => r['Year']
    }
  elsif r['Type'] == 'series'
    @results['tv'] << {
        'title' => r['Title'],
        'year' => r['Year']
    }
  end
end         


7 commentaires

Veuillez afficher le résultat (objet rubis) que vous voulez pour votre exemple.


Alors, que supposez-vous que la valeur du @results ["film"] est quand vous essayez d'abord de le pousser? Aussi, quelle erreur obtenez-vous? Pas de méthode?


@jvillian, je reçois des résultats, mais ça ne me donne que le dernier article de la boucle, je veux tous les articles


@CarySwoveland Les résultats que je voulais, c'est la structure d'objet JSON que j'ai placée ci-dessus.


J'ai mal compris. Vraisemblablement, résultats (non @Results ) est un hachage. Qu'est-ce que c'est?


@CarySwoveland, désolé pour la confusion de nommage, résultats est l'ensemble des résultats provenant d'une API que j'ai apporté une demande à. @results est le hachage que je veux réorganiser les données dans


"Le plus éloigné que j'ai disparu est que" n'est pas une description d'erreur suffisante précise pour nous pour vous aider. Qu'est-ce que ne fonctionne pas? Comment ne fonctionne-t-il pas? Quels problèmes avez-vous avec votre code? Avez-vous un message d'erreur? Quel est le message d'erreur? Est le résultat que vous n'obtenez pas le résultat que vous attendez? Quel résultat attendez-vous et pourquoi, quel est le résultat que vous obtenez et comment les deux diffèrent-ils? Le comportement que vous observez n'est-il pas le comportement souhaité? Quel est le comportement souhaité et pourquoi, quel est le comportement observé et de quelle manière différent-ils?


3 Réponses :


0
votes

Je crois que le problème a à voir avec l'initialisation de votre hachage. Le film code> et code> et TV code> ne sont pas actuellement un tableau. Vous pouvez initialiser votre hasch comme ceci: xxx pré>

Voici comment il ressemble au reste de votre code: P>

@results = { 'movie' => [], 'tv' => [] }
results['Search'].each do |r|
  if r['Type'] == 'movie'
    @results['movie'] << {
        'title' => r['Title'],
        'year' => r['Year']
    }
  elsif r['Type'] == 'series'
    @results['tv'] << {
        'title' => r['Title'],
        'year' => r['Year']
    }
  end
end 


4 commentaires

Ah, merci beaucoup, c'est exactement ce que je cherche.


Vous préférez écrire @results = hachage.new {| h, k | h [k] = []} pour le rendre plus général. Si, par exemple, @results n'a pas de clé "film" , @Results ["film"] dans @RESULTS ['Film'] << {'Titre' => R ['Titre'], 'Année' => R ['Année'] sera défini sur un tableau vide avant << {' Titre '=> R [' Titre '],' Année '=> R [' Année ']} est exécuté.


@CarySwoveland c'est un bon point. La fabrication générale n'est utile que si ce code vise à servir un cas d'utilisation plus général que ce que l'OP a besoin, cependant.


Je suis d'accord, à condition que la boule de cristal ait conclu que les clés de hachage ne changeront pas à l'avenir.



1
votes

Je pense que vous pouvez obtenir ce que vous voulez en utilisant énumérable # chacun_with_object code> et attribuant une valeur par défaut au hachage.

def group_search_results(items)
  results = Hash.new { |hash, key| hash[key] = [] }
  items.each_with_object(results) do |item|
    results[item['Type']] << {'title' => item['Title'], 'year' => item['Year']}
  end
end

describe "search_results" do
  it "groups into an object" do
    items = [
      {'Type' => 'movie', 'Title' => 'Thor', 'Year' => 2011},
      {'Type' => 'movie', 'Title' => 'Iron Man', 'Year' => 2008},
      {'Type' => 'series', 'Title' => 'Parks and Recreation', 'Year' => 2009},
      {'Type' => 'series', 'Title' => 'Friends', 'Year' => 1994},
    ]

    results = group_search_results(items)
    expect(results).to eq({
      'movie' => [
        {'title' => 'Thor', 'year' => 2011},
        {'title' => 'Iron Man', 'year' => 2008},
      ],
      'series' => [
        {'title' => 'Parks and Recreation', 'year' => 2009},
        {'title' => 'Friends', 'year' => 1994},
      ],
    })
  end
end


0 commentaires

0
votes
results =  { 
  search: { 
    movie: [
      { title: 'Thor', year: 2011 },
      { title: 'Iron Man', year: 2008 },
    ],
    tv: [
      { title: 'Parks and Recreation', year: 2009 },
      { title: 'Friends', year: 1994 },
    ]
  }
}

@results = Hash.new{|k, v| k[v] = []}
results[:search].each do |type, array| 
  @results[type].push(*array) 
end

results[:search].each_with_object(Hash.new{|k, v| k[v] = []}) do |(type, array), hash| 
  hash[type].push(*array) 
end

0 commentaires