gpt4 book ai didi

javascript - 从 ES6 类过滤属性

转载 作者:行者123 更新时间:2023-11-29 11:00:37 27 4
gpt4 key购买 nike

我有一个Dto,我想启用服务层过滤:selectFields 方法采用应返回的字段名称数组,其他属性将被删除。
什么是枚举类属性的简短方法,以便我可以遍历它们并将过滤的属性设置为空?
在 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();

返回值将是一个普通的 json 对象,web 层( Controller )将其发送回 http 客户端。

最佳答案

如果你对传播运算符没问题,你可以尝试以下方法:

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 类。从这一点来看,我看到了一些可能的方法:

  • selectFields() 主体内实例化新的 UserServiceDto 对象,删除 ...fields< 中列出的所有字段 数组(javascript delete 没问题)并返回它;
  • 使用 UserServiceDto 构造函数参数来保存 selectFields() 上的正向逻辑,并仅将需要设置的 Prop 传递给构造函数;在这种情况下,实例化临时对象不需要删除属性;
  • 更改toJson 方法的签名,或者更好地添加一个新的签名,这将允许传递字段数组,然后将当前的selectFields 逻辑放入toJson 方法(并完全删除 selectFields 方法):new UserServiceDto().toJson('a', 'c')...

关于javascript - 从 ES6 类过滤属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47782426/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com