Ruby 2.5 эффективный способ удаления ключа ruby, если он содержит хэш только с одной парой ключ / вал - PullRequest
0 голосов
/ 18 декабря 2018

Предполагая структуру данных, которая выглядит следующим образом:

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 голосов
/ 19 декабря 2018

Всего пара вариантов больше, не говоря уже о способе проверки состояния.

Использование 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 }
0 голосов
/ 18 декабря 2018

Вариант 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?, который представляет собой любой массив с более чем 1 элементом

Другие примечания

  • Используется _ для неиспользуемых переменных, поскольку этоспособ показать "это не имеет значения"
  • назвал переменную inner - уверен, что есть лучшее имя, но value может сбить с толку
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...