我有以下方法,该方法获取一组数据并从中创建一个新的模型实例。 reportTemplateData
作为一个对象进行了分解,以便将其作为属性列表传递给类构造函数。
尽管这样做有效,但我认为可以更有效地完成它。一行左右有没有更优雅的方法?
addReportTemplate(reportTemplateData) {
const {
id,
pageId,
profileTemplateId,
userId,
name,
description,
createdAt,
updatedAt,
deletedAt,
createdBy,
updatedBy,
deletedBy,
reportTemplateColumns,
} = reportTemplateData;
const newReportTemplate = new ReportTemplate(
id,
pageId,
profileTemplateId,
userId,
name,
description,
createdAt,
updatedAt,
deletedAt,
createdBy,
updatedBy,
deletedBy,
reportTemplateColumns,
);
this.reportTemplates.push(reportTemplates);
}
编辑
值得一提的是,如果您使用const newReportTemplate = new ReportTemplate({...reportTemplateData})
解决方案,则必须将数据属性与类构造函数参数完全匹配。这对我来说是个问题,数据是在snake_case中传入的,而我的Javascript模型正在寻找camelCase。
答案 0 :(得分:3)
假定只有要传递的属性位于该对象中。
addReportTemplate(reportTemplateData) {
const newReportTemplate = new ReportTemplate({ ...reportTemplateData });
this.reportTemplates.push(reportTemplates);
}
如果要排除一些属性,请对其进行重构。
addReportTemplate(reportTemplateData) {
const {
excluded1,
excluded2,
...properties,
} = reportTemplateData;
const newReportTemplate = new ReportTemplate({ ...properties });
this.reportTemplates.push(reportTemplates);
}
这两种方法都需要在ReportTemplate类中进行更改,在该类中,构造函数将对象作为参数。 请在this pen中查看有关此方法如何工作的两个示例。
答案 1 :(得分:1)
首先,您的ReportTemplate
可以将单个对象作为输入参数,而不必使用大量参数。
如果不可能的话,您可以对其进行一些简化,在您的函数定义中使用反结构化功能:
addReportTemplate({
id,
pageId,
profileTemplateId,
userId,
name,
description,
createdAt,
updatedAt,
deletedAt,
createdBy,
updatedBy,
deletedBy,
reportTemplateColumns,
}) {
// ...
}
答案 2 :(得分:1)
请改用属性名称数组,从参数中提取属性,然后使用具有这些属性的对象调用ReportTemplate
。您可以使用reduce
将属性名称数组转换为具有这些属性的对象。例如:
function addReportTemplate(reportTemplateData) {
const propNames = ['id', 'pageId', 'userId'];
const templateArg = propNames.reduce((a, propName) => {
a[propName] = reportTemplateData[propName];
return a;
}, {});
console.log(templateArg);
}
addReportTemplate({
id: 'id!',
pageId: 'pageId!',
userId: 'userId!',
someOtherProp: 'someOtherProp'
});
答案 3 :(得分:1)
您可以简单地使用散布运算符reportTemplateData
并将其作为对象传递,而不用解构...
并从中传递单个字段:
addReportTemplate(reportTemplateData) {
const newReportTemplate = new ReportTemplate({...reportTemplateData});
this.reportTemplates.push(newReportTemplate);
}
最后,在ReportTemplate
中,将参数作为单个对象接收,在那里您可以解构必需的字段。
答案 4 :(得分:0)
如果必须仅为ReportTemplate
提供特定参数,并且可以为addReportTemplate
提供任何参数,则可以使用以下变体:
addReportTemplate(reportTemplateData) {
const newReportTemplates = {};
for (const param in [
'id',
'pageId',
'profileTemplateId',
'userId',
'name',
'description',
'createdAt',
'updatedAt',
'deletedAt',
'createdBy',
'updatedBy',
'deletedBy',
'reportTemplateColumns',
]) {
newReportTemplates[param] = reportTemplateData[param];
}
this.reportTemplates.push(newReportTemplates);
}
否则,其他答案都很好。