Javascript Es6-使用不同的名称匹配两个不同的对象键

Javascript Es6-使用不同的名称匹配两个不同的对象键,javascript,node.js,ecmascript-6,Javascript,Node.js,Ecmascript 6,我正在处理两个API,我无权更改它们的字段名(下面的示例) 基本上,我需要将数据从api2传输到API1,因此我所做的是: const payload = {} payload["studentId"] = api2.id, payload["studentName"] = api2.personalInfo.name, payload["studentAge"] = api2.personalInfo.age, payload[&qu

我正在处理两个API,我无权更改它们的字段名(下面的示例)

基本上,我需要将数据从api2传输到API1,因此我所做的是:

const payload = {}
payload["studentId"] = api2.id,
payload["studentName"] = api2.personalInfo.name,
payload["studentAge"] = api2.personalInfo.age,
payload["course"] = api2.course,

有没有一种方法可以动态地做到这一点?

您可以使用一个包装器对象,将给定API的所有想要的属性包装到一个新API中

这种方法采用一个对象,该对象将给定的属性映射到所需结构的新格式/名称,方法是获取该对象的条目并迭代这些条目,直到找到一个非对象,然后将该值分配给一个新对象。如果找到一个对象,它将获取该对象并从嵌套对象获取值

如果提供了嵌套的目标属性,如

{ studentName: 'personalInfo.name' }
(例如,从API1创建API2)需要拆分值并创建具有嵌套结构的对象,如

const
    path = value.split('.'),
    last = path.pop();

path.reduce((o, k) => o[k] ??= {}, target)[last] = source[key];
else
部分中

const
assign=(源、包装器、目标={})=>{
Object.entries(wrapper.forEach)([key,value])=>{
if(value&&typeof value==='object')赋值(源[键]、值、目标);
else目标[值]=源[键];
});
回报目标;
},
api1={studentId:'abc',studentName:'John Doe',学生年龄:19,课程:'Engineering'},
api2={id:'someId',personalInfo:{name:'someName',age:'someAge'},course:'someCourse'},
包装器={id:'studentId',personalInfo:{name:'studentName',年龄:'studentAge'},课程:'course'},
有效负载=分配(api2,包装器);

控制台日志(有效载荷)您可以获取一个包装器对象,该对象将给定API的所有想要的属性包装到一个新API中

这种方法采用一个对象,该对象将给定的属性映射到所需结构的新格式/名称,方法是获取该对象的条目并迭代这些条目,直到找到一个非对象,然后将该值分配给一个新对象。如果找到一个对象,它将获取该对象并从嵌套对象获取值

如果提供了嵌套的目标属性,如

{ studentName: 'personalInfo.name' }
(例如,从API1创建API2)需要拆分值并创建具有嵌套结构的对象,如

const
    path = value.split('.'),
    last = path.pop();

path.reduce((o, k) => o[k] ??= {}, target)[last] = source[key];
else
部分中

const
assign=(源、包装器、目标={})=>{
Object.entries(wrapper.forEach)([key,value])=>{
if(value&&typeof value==='object')赋值(源[键]、值、目标);
else目标[值]=源[键];
});
回报目标;
},
api1={studentId:'abc',studentName:'John Doe',学生年龄:19,课程:'Engineering'},
api2={id:'someId',personalInfo:{name:'someName',age:'someAge'},course:'someCourse'},
包装器={id:'studentId',personalInfo:{name:'studentName',年龄:'studentAge'},课程:'course'},
有效负载=分配(api2,包装器);

控制台日志(有效载荷)你所说的“动态”是什么意思?我不这么认为:那是因为你需要知道
api2
的嵌套子结构,然后才能执行到一个一层深的对象的映射。这看起来是最有可能的方法,我想你只需要解决这个问题,有点脏,特别是如果有更多的钥匙。。。无论如何,非常感谢你们!将
const{id:studentId,personalInfo:{name:studentName,age:studentAge},course}=api2,payload={studentId,studentName,studentAge,course}做你想做的事?你说的“动态”是什么意思?我不这么认为:那是因为你需要知道
api2
的嵌套子结构,然后才能执行到一个一层深的对象的映射。这看起来是最有可能做的方法,所以我想这一种就可以了,有点脏,特别是如果有更多的钥匙。。。无论如何,非常感谢你们!将
const{id:studentId,personalInfo:{name:studentName,age:studentAge},course}=api2,payload={studentId,studentName,studentAge,course}做你想做的吗?我觉得这是因为过度工程。它与一系列作业的作用相同,但可读性和灵活性较差。它也不能回答这个问题(以某种方式动态地完成)。@Ourobrus因此,仅仅通过分配任务来完成任务要好得多?它不一定更好,只是更容易阅读和更灵活。如果您碰巧有很多不同类型的转换要做,那么最好是创建这样的函数,也许是为了在不需要重新编译(如果这只是一个步骤)的情况下访问配置。这只是一个事实,你不能以动态的方式完成你的任务,因为如果你不明确地定义它,计算机就无法清楚地理解两个API之间的字段需要如何匹配,并且赋值与任何其他方式都一样好。我觉得这会受到过度工程的影响。它与一系列作业的作用相同,但可读性和灵活性较差。它也不能回答这个问题(以某种方式动态地完成)。@Ourobrus因此,仅仅通过分配任务来完成任务要好得多?它不一定更好,只是更容易阅读和更灵活。如果您碰巧有很多不同类型的转换要做,那么最好是创建这样的函数,也许是为了在不需要重新编译(如果这只是一个步骤)的情况下访问配置。事实上,您无法以动态的方式完成任务,因为如果不明确定义两个API之间的字段,计算机无法清楚地理解两个API之间的字段需要如何匹配,并且分配与任何其他方式一样好。