На этой неделе я поделюсь с вами одной вещью, которая свела меня с ума. И как я это отладил и нашел первопричину.

Прежде чем перейти непосредственно к решению, позвольте мне объяснить вам мой вариант использования, чтобы облегчить понимание проблемы. Я получил большие данные в формате 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 не сработает при следующих условиях:

  1. Когда такого ключа нет.
  2. Когда ключ присутствует, он не имеет для него ценности (что не определено в нашем термине).
  3. Когда он равен нулю.

Я определился с этими сценариями и проверил код.

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

Я забываю, что это приведет к ошибке еще одного сценария сбоя, то есть (логического).

Третий ключ (isDisabled) в объекте имеет логический тип, если пользователь устанавливает для него значение false вместо true. Он выйдет из строя и останется прежним (новое изменение не будет обновлено) в соответствии с моей логикой.

Отсюда я начал использовать точное свойство для своего варианта использования - Object.prototype.hasOwnProperty (). Это свойство проверит наличие ключа. Чтобы узнать о нем подробнее, перейдите по этой ссылке.

Если вы нашли это полезным, похлопайте в ладоши, нажав 👏 (Вы знаете, что вы можете хлопать больше одного раза? Попробуйте и убедитесь сами!). Вы также можете подписаться на меня в Twitter. Вы также можете ознакомиться с моими предыдущими статьями в medium и scotch.io.

Я живу в Интернете по адресу https://madhankumar028.github.io

✉️ Подпишитесь на рассылку еженедельно Email Blast от CodeBurst 🐦 Подпишитесь на CodeBurst на Twitter , просмотрите 🗺️ Дорожная карта веб-разработчиков на 2018 год и 🕸️ Изучите веб-разработку с полным стеком .