Ruby 2.5删除红宝石密钥的有效方法,如果它包含仅具有一个密钥/值对的哈希值

时间:2018-12-18 16:38:39

标签: ruby

假设数据结构如下所示:

foo = {
    'first': {
        'bar': 'foo'
    },
    'second': {
        'bar': 'foobar',
        'foo': 'barfoo'
    },
    'third': {
        'test': 'example'
    }
}

我想从哈希foo中删除所有包含只有一个键/值对的条目的键。在这种情况下,操作完成后,foo只应该离开:

foo = {
    'second': {
        'bar': 'foobar',
        'foo': 'barfoo'
    }
}

由于foo['first']foo['third']仅包含一对密钥/值对。

2 个答案:

答案 0 :(得分:4)

选项1-delete_if

foo.delete_if { |_, inner| inner.one? }
  • delete_if具有破坏性,因此会改变原始哈希值
  • 这将使空散列消失

选项2-reject

这不再变异了:

foo = foo.reject { |_, inner| inner.one? }
  • 这将使空散列消失

选项3-select

没有突变,加上其他运算符:

foo = foo.select { |_, inner| inner.size > 1 }

选项4-many?-仅导轨

foo = foo.select { |_, inner| inner.many? }
  • 如果您使用的是Rails,它会为您定义#many?,它是包含多于一项的任何数组

其他说明

  • _用于未使用的变量,因为这是显示“这无关紧要”的一种方式
  • 将变量命名为inner-确信存在更好的名称,但value可能会造成混淆

答案 1 :(得分:1)

仅需一对选项,就为检查情况提供了方便。

使用 Hash#keep_if

foo.keep_if{ |_, v| v.size > 1 }

更复杂的 Enumerable#each_with_object

foo.each_with_object({}){ |(k,v), h| h[k] = v if v.size > 1 }