В этом посте я объясню решение проблемы для сокрытия или маскирования, то есть для «прикрытия» значений атрибутов, которые вложены и появляются один или несколько раз в объекте Javascript.

Понятие проблемы

В некоторых случаях такие компании, как fintechs или healthtechs, ежедневно имеют дело с конфиденциальными данными. Это может стать проблемой, когда разработчики добавляют журналы в код, чтобы иметь возможность его отлаживать. Эти журналы печатаются и хранятся в таких местах, как S3 или Google Cloud Platform, в течение недель / месяцев или даже лет, к которым имеют доступ все разработчики в этой компании.

Это означает, что в бета-средах у нас нет никаких проблем, поскольку данные могут быть подделаны, но в производственной среде, где данные соответствуют реальным людям, это кажется деликатной проблемой. Разработчики в компании будут иметь возможность просматривать конфиденциальные данные, которые раскрываются, например результаты о состоянии здоровья или информация о банковском счете; когда эти данные не участвуют в процессе отладки разработчика и могут вызвать проблемы в долгосрочной перспективе, поскольку это противоречит GDPR.

Определение требований к решению

Поэтому нам нужен помощник, который позаботится о маскировании или даже сокрытии конфиденциальных данных, которые мы ему указываем. В большинстве случаев лучшим действием является замаскирование атрибута, поскольку мы по-прежнему хотим иметь возможность отлаживать и отслеживать, содержится ли атрибут в объекте.

Но может существовать сценарий, в котором нам даже не нужен атрибут, потому что он не важен для проверки правильности работы нашего метода / службы, поэтому мы хотим иметь возможность скрыть этот атрибут от объекта, а не в исходный объект, но в его клоне для журналов.

Как только мы узнаем нашу проблему и желаемое решение, мы должны подумать о том, как решить эту проблему. Учитывая массив атрибутов, которые нужно замаскировать, и объект Javascript, мы хотим найти эти атрибуты в объекте, а затем выполнить с ними любое действие, которое мы пожелаем. Для этого нам нужно будет пройти по всему объекту, ища и проверяя каждую клавишу.

С другой стороны, если мы проанализируем объект Javascript, например следующий:

Мы видим, что объект JS - это в основном дерево, где каждый узел является ключом / атрибутом, и у нас есть отношения родительско-дочерних ключей, поскольку один атрибут может быть самим объектом и иметь податрибуты.

Итак, еще раз взглянув на объект выше, мы можем сказать, что он эквивалентен:

После того, как мы преобразовали наш объект в дерево, мы знаем, что нам нужно пройти все дерево, чтобы проверить каждый ключ. В этом случае мы можем подойти к этой проблеме двумя способами: Алгоритм поиска в глубину или Алгоритм поиска в ширину. Любой из этих двух алгоритмов сработает.

Существующие решения

При рассмотрении вопроса о том, следует ли использовать индивидуальное решение или использовать уже существующую библиотеку, всегда предпочтительнее второе, поскольку оно требует меньше времени и ресурсов, и, в конце концов, вам не нужно изобретать колесо, верно?

При поиске библиотеки для этой проблемы мы нашли некоторые из них довольно интересными:

  • Deepdash: это библиотека, созданная на основе Lodash, которая помогает вам работать с вложенными значениями и атрибутами в объекте. Проблема в том, что у вас есть только возможность скрыть атрибут (с помощью метода omitDeep), но не замаскировать его.


  • Maskdata: это модуль Node.js для маскировки различных типов данных. С помощью maskdata вы можете замаскировать адрес электронной почты, номер телефона, номер карты, поля JSON, пароль и т. Д. Проблема в том, что он позволяет только замаскировать атрибут, а не скрыть его.


В большинстве случаев любой из этих двух библиотек будет более чем достаточно для решения проблемы, но по-прежнему неприятно иметь не только библиотеку, которая может комбинировать маску и скрытие, но и иметь возможность добавлять пользовательские параметры, такие как char для замены значения атрибута или длины строки, которая заменит исходное значение. Итак… Я разработал собственный!

Выбор решения: рекурсивность будет нашим союзником

Как мы видели ранее, объект - это просто дерево, по которому мы хотим пройти. Из двух алгоритмов, которые были упомянуты ранее, я решил выбрать алгоритм поиска в глубину, применяющий рекурсивность.

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

Так, например, мы хотим замаскировать из объекта на рисунке 1.1 атрибуты id и views, сохраняя исходную длину значения. Результат при использовании библиотеки будет:

Чтобы узнать больше о библиотеке, которая называется nested-mask, ознакомьтесь с документацией здесь.