Ruby 中哈希的一些骚操作

2018-07-05  本文已影响32人  Vincent_Jiang

字面量方式创建哈希

irb(main):001:0> { foo: 1, bar: 2 }
=> {:foo=>1, :bar=>2}

clear 方法可以清除哈希里面的数据

irb(main):001:1> { foo: 1, bar: 2 }.clear
=> {}

delete delete_if 可以删除和删除指定条件的键值对

irb(main):001:2> { foo: 1, bar: 2 }.delete(:foo)
=> 1
irb(main):001:3> { foo: 1, bar: 2 }.delete_if { |key, value| key == :foo || value == 1 }
=> {:bar=>2}

reject reject! 也可以删除指定的键值对

irb(main):001:4> { foo: 1, bar: 2 }.reject { |key, value| key == :bar || value == 2 }
=> {:foo=>1}

invert 方法可以用来颠倒键值对

irb(main):001:5> { foo: 1, bar: 2 }.invert
=> {1=>:foo, 2=>:bar}

keys values 可以获取键值的集合

irb(main):001:6> { foo: 1, bar: 2 }.keys
=> [:foo, :bar]
irb(main):001:7> { foo: 1, bar: 2 }.values
=> [1, 2]

has_key? has_value? 方法可以检测哈希中是否包含指定的键值

irb(main):001:8> { foo: 1, bar: 2 }.has_key?(:foo)
=> true
irb(main):001:9> { foo: 1, bar: 2 }.has_value?(1)
=> true

each each_key each_value 用于迭代哈希

irb(main):002:0> { foo: 1, bar: 2 }.each { |key, value| } 
=> {:foo=>1, :bar=>2}
irb(main):002:4> { foo: 1, bar: 2 }.each_key { |k| puts "key = #{k}" }
key = foo
key = bar
=> {:foo=>1, :bar=>2}
irb(main):002:5> { foo: 1, bar: 2 }.each_value { |v| puts "value = #{v}" }
value = 1
value = 2
=> {:foo=>1, :bar=>2}

merge merge! 用来合并两个哈希

irb(main):002:6> { foo: 1 }.merge({ bar: 2 })
=> {:foo=>1, :bar=>2}
irb(main):002:7> { foo: 1 }.merge!({ bar: 2 })
=> {:foo=>1, :bar=>2}

symbolize_keys symbolize_keys! 方法用来将所有的键转换为 symbol

irb(main):002:8> hash = JSON.parse('{ "foo": 1, "bar": 2 }')
=> {"foo"=>1, "bar"=>2}
irb(main):002:9> hash.symbolize_keys!
=> {:foo=>1, :bar=>2}

按键排升序降序

irb(main):002:10> { foo: 1, bar: 2 }.sort { |k, v| k.first <=> v.first }.to_h
=> {:bar=>2, :foo=>1}
irb(main):002:11> { foo: 1, bar: 2 }.sort { |k, v| v.first <=> k.first }.to_h
=> {:foo=>1, :bar=>2}

按值排升序降序

irb(main):002:12> { foo: 1, bar: 2 }.sort { |k, v| k.last <=> v.last }.to_h
=> {:foo=>1, :bar=>2}
irb(main):002:13> { foo: 1, bar: 2 }.sort { |k, v| v.last <=> k.last }.to_h
=> {:bar=>2, :foo=>1}
上一篇 下一篇

猜你喜欢

热点阅读