代码之家  ›  专栏  ›  技术社区  ›  randombits

Ruby 2.5如果Ruby密钥包含一个只有一个key/val对的散列,那么它是删除Ruby密钥的有效方法

  •  1
  • randombits  · 技术社区  · 6 年前

    假设数据结构如下所示:

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

    foo 包含一个只有一个key/val对的条目的。在这种情况下,特别是在手术完成后, 应该只剩下:

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

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

    2 回复  |  直到 6 年前
        1
  •  4
  •   John Gallagher    6 年前

    选择1- delete_if

    foo.delete_if { |_, inner| inner.one? }
    
    • 如果需要,请删除 破坏性的散列会使原始散列发生变异
    • 这将允许通过空哈希

    选择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 可能会让人困惑
        2
  •  1
  •   iGian    6 年前

    只是一对选项更多,让分开的方式来检查条件。

    使用 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 }