На этой неделе я поделюсь с вами одной вещью, которая свела меня с ума. И как я это отладил и нашел первопричину.
Прежде чем перейти непосредственно к решению, позвольте мне объяснить вам мой вариант использования, чтобы облегчить понимание проблемы. Я получил большие данные в формате JSON от GET API, и я исправил некоторые из этих значений в форме пользовательского интерфейса. Пользователь может обновить свои новые изменения, нажав кнопку сохранения. Мне нужно объединить эти новые изменения с существующим JSON без потери ключа в существующем объекте.
Я написал логику для объединения новых изменений с существующим объектом и обновил форму.
Рассмотрим объект ниже как ответ, который я получил от сервера. Для простоты я использую объект с тремя ключами.
#snippet_one let response = { manual_timezone: 'GMT (+5.30)', role: 'Admin', isDisabled: true };
Я исправил все значения в пользовательском интерфейсе, и пользователь обновил форму своими новыми изменениями. Рассмотрим приведенный ниже пример как измененное значение.
#snippet_two let updatedData = { role: 'Viewer', isDisabled: false }; // Only new changes will be adding in this updatedData object
Теперь перейдем к небольшому фрагменту кода, из-за которого проблему было сложно устранить.
#snippet_three for (let key in response) { if (updatedData[key]) { // do something } }
В приведенном выше фрагменте кода внутри цикла for. Я проверяю наличие свойства, используя скобки в объекте updatedData. Если он присутствует (происходят новые изменения), сделайте что-нибудь.
Первые два свойства внутри типа объекта ответа - это строка, а тип последнего - логическое.
Я считал, что вышеупомянутый цикл if не сработает при следующих условиях:
- Когда такого ключа нет.
- Когда ключ присутствует, он не имеет для него ценности (что не определено в нашем термине).
- Когда он равен нулю.
Я определился с этими сценариями и проверил код.
Через несколько дней специалист по контролю качества поднял вопрос о моей функциональности. Я занимался отладкой, чтобы найти первопричину. Позже я нашел эту первопричину и лучшее решение этой проблемы.
Я забываю, что это приведет к ошибке еще одного сценария сбоя, то есть (логического).
Третий ключ (isDisabled) в объекте имеет логический тип, если пользователь устанавливает для него значение false вместо true. Он выйдет из строя и останется прежним (новое изменение не будет обновлено) в соответствии с моей логикой.
Отсюда я начал использовать точное свойство для своего варианта использования - Object.prototype.hasOwnProperty (). Это свойство проверит наличие ключа. Чтобы узнать о нем подробнее, перейдите по этой ссылке.
Если вы нашли это полезным, похлопайте в ладоши, нажав 👏 (Вы знаете, что вы можете хлопать больше одного раза? Попробуйте и убедитесь сами!). Вы также можете подписаться на меня в Twitter. Вы также можете ознакомиться с моими предыдущими статьями в medium и scotch.io.
Я живу в Интернете по адресу https://madhankumar028.github.io
✉️ Подпишитесь на рассылку еженедельно Email Blast от CodeBurst 🐦 Подпишитесь на CodeBurst на Twitter , просмотрите 🗺️ Дорожная карта веб-разработчиков на 2018 год и 🕸️ Изучите веб-разработку с полным стеком .