代码之家  ›  专栏  ›  技术社区  ›  Vlad Hilko

如何通过设置键元素的优先级来对带有字符串键的ruby哈希进行排序?

  •  1
  • Vlad Hilko  · 技术社区  · 7 年前

    hash = {
      'red': { something: ''},
      'green': { something: '' },
      'yellow': { something: ''}
    }
    

    做这样的事情最简单的方法是什么:

    hash.sort_by_key_with_priority(['green', 'yellow', 'red'])
    

    并返回:

    hash = {
      'green': { something: '' },
      'yellow': { something: ''},
      'red': { something: ''},
    }
    
    4 回复  |  直到 7 年前
        1
  •  7
  •   Sergio Tulentsev    7 年前

    如果优先级数组包含所有哈希键,则不需要排序。您可以简单地将散列分解并构造一个新的散列。

    hash = {
      red: { something: ''},
      green: { something: '' },
      yellow: { something: ''}
    }
    
    priority = %i[green yellow red]
    
    hash.slice(*priority)
    # => {:green=>{:something=>""}, :yellow=>{:something=>""}, :red=>{:something=>""}}
    
        2
  •  4
  •   Sundeep    7 年前

    如果哈希中存在未包含在优先级数组中的键:

    >> h = {red: 512, green: 63, yellow: 99, foo: 42, baz: 'hi'}
    => {:red=>512, :green=>63, :yellow=>99, :foo=>42, :baz=>"hi"}
    >> p = %i[green yellow red]
    => [:green, :yellow, :red]
    
    # this puts keys not in array at start
    # h.sort_by { |k, v| p.include?(k) ? p.index(k) : -1 }
    >> h.sort_by { |k, v| p.index(k) || -1 }
    => [[:foo, 42], [:baz, "hi"], [:green, 63], [:yellow, 99], [:red, 512]]
    
    # this puts keys not in array at end
    # h.sort_by { |k, v| p.include?(k) ? p.index(k) : p.size }
    >> h.sort_by { |k, v| p.index(k) || p.size }
    => [[:green, 63], [:yellow, 99], [:red, 512], [:foo, 42], [:baz, "hi"]]
    

    使用 to_h hash

        3
  •  0
  •   Rajagopalan    7 年前
    hash = {
        'red': { something: ''},
        'green': { something: '' },
        'yellow': { something: ''}
    }
    

    代码

    p ['green', 'yellow', 'red'].map{|value|[value.to_sym,hash[value.to_sym]]}.to_h
    

    输出

    {:green=>{:something=>""}, :yellow=>{:something=>""}, :red=>{:something=>""}}
    
        4
  •  0
  •   ray    7 年前

    以下也将起作用,

    priority = %i(:green yellow red)
    
    priority.inject({}) { |m, v| m[v] = hash[v]; m }