Как динамически сопоставить ключ JSON

#javascript #json #data-structures #mapping

Вопрос:

Итак, у меня есть начальный объект JSON, полученный в результате вызова API. Мне нужно сопоставить эти данные со вторым объектом JSON, который затем будет использоваться приложением. Исходный объект из вызовов API выглядит примерно так…

 const initialData =  {
        "PersonId": 1234,
        "Surname": "Blogs",
        "Forename": "Joe"
        }
 

и это должно выглядеть так, чтобы быть потреблено передним концом…

 {
    "IdNumber": 1234,
    "Last_name": "Blogs",
    "First_name": "Joe"
}
 

Изначально я написал это…

 const mappedData = (initialData) => {
   return {
        "IdNumber": initialData.PersonId,
        "Last_name": initialData.Surname,
        "First_name": initialData.Forename
   }
} 
 

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

Спасибо!

Комментарии:

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

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

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

4. Вы можете экстернализировать отображение ключей в объектную переменную и заставить свою функцию полагаться на эту переменную, но у вас все равно будет та же проблема. Если внутренний ключ изменится, вам все равно нужно будет изменить его на своей карте.

Ответ №1:

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

Если вы все еще хотите делать это динамически, хорошим способом было бы:

  1. Используйте метод JavaScript Object.keys (), чтобы получить ключи объекта.
  2. Сопоставьте значения объекта с их новыми именами значений

Это было бы примером:

 
function changeObjectNames(initialData) {
  const keys = Object.keys(initialData);

  return {
        "IdNumber": initialData[keys[0]],
        "Last_name": initialData[keys[1]],
        "First_name": initialData[keys[2]]
  }
}

 

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

Комментарии:

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

2. Я полностью согласен с тобой, Линда. Я бы не рекомендовал это делать и не использовал в производстве.

3. Спасибо, Арнольд. Я также придерживался этой идеи и ценю ответ, однако, как вы заявили, данные могут отображаться в другом порядке, поэтому я не могу принять это как ответ