Сплющивание массива – распространенный вопрос в 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 может принимать целое число, чтобы указать уровень рекурсии для сглаживания