Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何动态映射JSON密钥_Javascript_Json_Data Structures_Mapping - Fatal编程技术网

Javascript 如何动态映射JSON密钥

Javascript 如何动态映射JSON密钥,javascript,json,data-structures,mapping,Javascript,Json,Data Structures,Mapping,因此,我有一个来自API调用的初始JSON对象。我需要将此数据映射到第二个JSON对象,然后应用程序将使用该对象。 API调用的初始对象如下所示 const initialData = { "PersonId": 1234, "Surname": "Blogs", "Forename": "Joe" } 它需要像这样被前端消费 {

因此,我有一个来自API调用的初始JSON对象。我需要将此数据映射到第二个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中某个密钥的名称(例如,有人进入数据库并决定Forename应为FirstName),则我拉入的数据不再正确映射,我的应用程序将中断。 有人能解释一下如何/如果可以动态地做到这一点吗


谢谢

首先,我建议您和您团队中的人员不要更改数据库条目的名称,并且找不到任何人这样做的明确原因。但是,如果确实要更改名称,最好的做法是在前端和后端都更改条目的名称

如果您仍然希望动态执行此操作,一个好方法是:

  • 使用JavaScript方法Object.keys()获取对象的键
  • 将对象的值映射到它们的新值名称
  • 这将是一个例子:

    
    函数changeObjectNames(initialData){
    const keys=Object.keys(initialData);
    返回{
    “IdNumber”:初始数据[键[0]],
    “姓氏”:初始数据[键[1]],
    “名字”:初始数据[键[2]]
    }
    }
    

    我提出的解决方案存在一个问题:数据可能以错误的顺序出现。就目前而言,这是我能提供的最好答案。因此,我建议您不要尝试更改数据库条目的名称,除非绝对必要。

    首先,我建议您和您团队中的人员不要更改数据库条目的名称,并且找不到任何人这样做的明确原因。但是,如果确实要更改名称,最好的做法是在前端和后端都更改条目的名称

    如果您仍然希望动态执行此操作,一个好方法是:

  • 使用JavaScript方法Object.keys()获取对象的键
  • 将对象的值映射到它们的新值名称
  • 这将是一个例子:

    
    函数changeObjectNames(initialData){
    const keys=Object.keys(initialData);
    返回{
    “IdNumber”:初始数据[键[0]],
    “姓氏”:初始数据[键[1]],
    “名字”:初始数据[键[2]]
    }
    }
    

    我提出的解决方案存在一个问题:数据可能以错误的顺序出现。就目前而言,这是我能提供的最好答案。因此,我建议您不要尝试更改数据库条目的名称,除非这是绝对必要的。

    如果您开始更改内容的值,任何事情都会中断,这就是您在数据库和应用程序之间建立协议的原因。只是不要更改名称。完全同意你的意见,但这是一项要求。我只是想让它尽可能健壮。简单的答案是,计算机不理解这种情况。但您可以检查熟悉的名称(例如,检查密钥名称,如FirstName、FirstName、FirstName等),并相应地设计应用程序。您可以将密钥映射外部化为对象变量,并使您的函数依赖于该变量,但您仍然会遇到相同的问题。如果后端密钥发生更改,您仍然需要在地图中更改它。如果您开始更改内容的值,任何事情都会中断,这就是为什么您要在数据库和应用程序之间建立协议的原因。只是不要更改名称。完全同意你的意见,但这是一项要求。我只是想让它尽可能健壮。简单的答案是,计算机不理解这种情况。但您可以检查熟悉的名称(例如,检查密钥名称,如FirstName、FirstName、FirstName等),并相应地设计应用程序。您可以将密钥映射外部化为对象变量,并使您的函数依赖于该变量,但您仍然会遇到相同的问题。如果后端密钥发生更改,您仍然需要在地图中对其进行更改。根据他们的要求,这是一个可靠的答案,但比他们目前所做的更糟糕(因为您解释了有关订单的原因)。所以我不推荐这个,我完全同意你,琳达。我既不推荐也不在生产中使用。谢谢阿诺德。我也接受这个想法,并感谢您的回答。但是,正如您所说,数据可能以不同的顺序出现,因此我不能接受这一回答。根据他们的要求,这是一个可靠的答案,但比他们目前正在做的更糟(因为您解释了有关顺序的原因)。所以我不推荐这个,我完全同意你,琳达。我既不推荐也不在生产中使用。谢谢阿诺德。我也接受这个想法,并感谢您的回答。但是,正如您所说,数据可能会以不同的顺序出现,因此我不能接受这个答案