【问题标题】:Better way to create an object from an object of properties?从属性对象创建对象的更好方法?
【发布时间】:2018-12-19 13:34:15
【问题描述】:

在我的应用中,我使用来自 API 请求的数据创建了几个不同的对象,如下所示:

const newRelationship = new Relationship(
    data.id,
    data.account_id,
    data.name,
    data.description,
    data.created_at,
    data.created_by,
    data.deleted_at,
    data.deleted_by,
    data.updated_at,
    data.updated_by,
);

这感觉有点麻烦。有没有更好的(一行)方法来做到这一点,而不是像这样手动写出所有参数?

我希望如下所示,但我还没有 100% 了解传播/解构。

const newRelationship = new Relationship(...data);

我的关系构造函数如下:

constructor(id, accountId, name, description, createdAt, createdBy, updatedAt, updatedBy, deletedAt, deletedBy) {
    this.id = id || '';
    this.accountId = accountId || '';
    this.name = name || '';
    this.description = description || '';
    this.createdAt = createdAt || '';
    this.createdBy = createdBy || '';
    this.deletedAt = deletedAt || '';
    this.deletedBy = deletedBy || '';
    this.updatedAt = updatedAt || '';
    this.updatedBy = updatedBy || '';
}

【问题讨论】:

  • 但传播不会按照这个顺序,最好改变关系的工作方式
  • 请发布您的关系构造函数。它期待一个对象吗?
  • 你也可以使用named parameters
  • 为什么不将data 对象本身传递给构造然后使用它?!!

标签: javascript es6-class destructuring spread-syntax


【解决方案1】:

如果您正在编写类/函数(意见),我会在参数中使用对象解构,它明确表明您正在将对象传递给函数并枚举属性(您可以如果您想在解构语句中重命名它们)。如果您使用的代码无法自行更新,我建议您使用带有Object.values()的数组扩展@

class Relationship {
  constructor({ id, account_id, name, description, created_at, created_by, deleted_at, deleted_by, updated_at, updated_by }) {
    // do stuff with your variables
    console.log(`ID is ${id}`);
  }
}

class OtherRelationship {
  constructor(id, account_id, name, description, created_at, created_by, deleted_at, deleted_by, updated_at, updated_by) {
    // do stuff with your variables
    console.log(`ID is ${id}`);
  }
}

const dummyParams = { 
  id: 1, 
  account_id: 1, 
  name: 'test', 
  description: 'tesssst', 
  created_at: 'some date', 
  created_by: 1, 
  deleted_at: 'some date', 
  deleted_by: 1, 
  updated_at: 'some date', 
  updated_by: 1, 
}

const newRelationship = new Relationship(dummyParams);
const newOtherRelationship = new OtherRelationship(...Object.values(dummyParams))

【讨论】:

  • values 的顺序不保证。这可能会导致一些非常奇怪且难以捕捉的错误。
  • 嗯,这似乎与描述不一致 'Object.values() 返回一个数组,其元素是在对象上找到的可枚举属性值。属性的顺序与通过手动循环对象的属性值给出的顺序相同。这是一个已知的错误吗?
  • 这不是错误。对象是按规范没有顺序的“属性包”。属性的顺序取决于引擎的实现。它只需要在 keys、values、entries 和 for-in 循环中保持一致。
【解决方案2】:

将您的构造函数简化为:

const defaults = { id: "", name: "", /*...*/ };

//...

constructor(options) {
 Object.assign(this, defaults, options);
}

那么你可以这样做:

new Relationship(data)

【讨论】:

  • 我不会在外部指定默认值,而是选择使用默认值解构语法。是的,您必须重复属性两次,但您将获得不复制不应出现在类实例中的参数的好处。
  • @patrick 是的,或者直接将它们分配给Relationship.prototype
猜你喜欢
  • 1970-01-01
  • 2019-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多