TIL вы можете указать уровень сплющивания массива в Ruby

Сплющивание массива — распространенный вопрос в Leetcode и на собеседовании. И по большей части я никогда не думал, что встречу его на своей работе (как и большинство вопросов, с которыми вы встречаетесь на собеседовании). Однако я выполняю сложный поиск в БД в rails и использую метод pluck.

Метод pluck возвращает массив элементов, которые вы хотите выбрать, например

User.find_by(category: "director").pluck(:email, :user_name)
=> [["johndoe@example.com", "John Doe"], ["janedoe@example.com", "Jane Doe"]]

Войти в полноэкранный режим Выйти из полноэкранного режима

Но поскольку я выполняю итеративный поиск (не самый эффективный, но мне еще предстоит оптимизация), я храню результаты каждой выборки в переменной массива, что означает, что в итоге я получаю глубоко вложенный массив. (Опять же, не самый эффективный вариант, я знаю).

Введите команду flatten. Flatten вернет новый массив, который является одномерным сплющиванием самого себя.

Но мне не нужен одномерный массив. Я хочу сохранить результаты команды pluck. Поэтому если вы просмотрите документацию, то обнаружите, что flatten на самом деле принимает целое число, которое определяет уровень рекурсии для flatten.

Это означает, что мы можем сделать следующее

[[[1,2],[3,4]]].flatten(1)
=> [[1,2],[3,4]]

[[[1,2],[3,4]]].flatten(2)
=> [1,2,3,4]

Войти в полноэкранный режим Выйти из полноэкранного режима

Это было довольно полезно, потому что если у вас есть многомерный массив, где каждый элемент является массивом из 2 элементов, вы можете передать методы to_h и преобразовать его в хэш, что довольно аккуратно.

[["johndoe@example.com", "John Doe"], ["janedoe@example.com", "Jane Doe"]].to_h
=> {"johndoe@example.com"=>"John Doe", "janedoe@example.com"=>"Jane Doe"}

Вход в полноэкранный режим Выход из полноэкранного режима

Вот так, метод Array#flatten может принимать целое число, чтобы указать уровень рекурсии для сглаживания

Оцените статью
Procodings.ru
Добавить комментарий