过滤ES6类的属性

时间:2017-12-12 22:16:13

标签: javascript ecmascript-6 es6-class

我有一个Dto,我想要启用服务层来过滤: 方法selectFields采用应返回的字段名称数组,其他属性将被删除 什么是枚举类的属性的简短方法,以便我可以遍历它们并将过滤后的属性设置为null? 在BaseDto我负责清理假值(我在这里也需要相同的功能)。

class UserServiceDto extends BaseDto {
  constructor(userDto) {
    super();
    this.fbUserId = userDto.fbUserId;
    this.fbFirstName = userDto.fbFirstName;
    this.fbLastName = userDto.fbLastName;
    this.gender = userDto.gender;
    this.birthdate = userDto.birthdate;
    this.aboutMe = userDto.aboutMe;
    this.deviceToken = userDto.deviceToken;
    this.refreshToken = userDto.refreshToken;
    this.updatedAt = userDto.updatedAt;
    this.createdAt = userDto.createdAt;
  }

  selectFields(fields) {
    // --> what's your take? 
  }

  toJson() {
    return super.toJson();
  }
}

编辑:
服务层从存储库层接收dto,包括所有数据库字段。 ServiceLayerDto旨在过滤掉web api不需要的字段(或者不应作为安全措施公开,例如PK字段,isDeleted等)。因此结果是我看到服务方法的结尾看起来像:

return new UserServiceDto(userDto)
  .selectFields('fbUserId', 'fbFirstName', 'fbLastName', 'birthdate', 'aboutMe', 'updatedAt', 'createdAt')
  .toJson();

返回值将是web层(控制器)发送回http客户端的普通json对象。

2 个答案:

答案 0 :(得分:2)

如果您对扩展运算符没问题,可以尝试以下方法:

class UserServiceDto {
  constructor() {
    this.a = 1;
    this.b = 2;
    this.c = 3;
  }
  selectFields(...fields) {
    const result = {};
    fields.forEach(key => result[key] = this[key]);
    return result;
  }
}

new UserServiceDto().selectFields('a', 'c'); // {a: 1, c: 3}

期待super.toJson()调用,我认为由于selectFields()调用的结果不会是UserServiceDto类的实例而无效。从这一点来看,我有一些可能的方法:

  • UserServiceDto正文中实例化新的selectFields()对象,删除...fields数组中列出 的所有字段(javascript delete为okey)并将其归还;
  • 使用UserServiceDto构造函数参数来保存selectFields()上的正逻辑,并仅传递给需要设置的道具的构造函数;在这种情况下,实例化临时对象不需要删除属性;
  • 更改toJson方法的签名,或者更好地添加新签名,这将允许传递字段数组,然后将当前selectFields逻辑放在toJson方法中(并删除{{总共1}}方法):selectFields ...

答案 1 :(得分:0)

纯粹是为了获取信息,我最终改变了我的应用程序架构。

存储库将Dto返回到服务层(dto直接从sql查询映射) 该服务基于Dto构建静态视图并将其返回到Web层(由普通json对象表示)。

在我的目录结构中,我有:

get(1)

视图是一个简单的过滤器。例如。 UserInfoView:

- service
-- views
--- index.js
--- UserInfo.js

使用视图,例如服务中的UserInfoView如下所示:

exports.build = ({ fbUserId, fbFirstName, fbLastName, gender, birthdate, aboutMe, updatedAt, createdAt }) => {
  return {
    fbUserId,
    fbFirstName,
    fbLastName,
    gender,
    birthdate,
    aboutMe,
    updatedAt,
    createdAt,
  };
};

我认为与我最初对这个问题的看法相比,这更具描述性。此外,它使数据对象保持平稳(无需其他方法) 遗憾的是,我无法在Web层中接收类型(View),我可能稍后可以使用Typescript解决该问题。