是否有一种优雅的方法将参数对象传递给函数?

时间:2018-08-15 08:52:09

标签: javascript javascript-objects

我有以下方法,该方法获取一组数据并从中创建一个新的模型实例。 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。

5 个答案:

答案 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);
}

否则,其他答案都很好。