Javascript 以功能编程方式将道具从obj复制到obj
我有这些接口:Javascript 以功能编程方式将道具从obj复制到obj,javascript,functional-programming,copy,Javascript,Functional Programming,Copy,我有这些接口: export interface QueryObject { id: ID; path: string[]; filters: Filters; } export interface Filters { state: string; localeID: string; role: string; } 并试图提出一个函数式编程解决方案,以便将现有的、具有值的属性从tmp对象复制到现有的数据模型中。现在,。。显然,这
export interface QueryObject {
id: ID;
path: string[];
filters: Filters;
}
export interface Filters {
state: string;
localeID: string;
role: string;
}
并试图提出一个函数式编程解决方案,以便将现有的、具有值的属性从tmp对象复制到现有的数据模型中。现在,。。显然,这是行不通的<代码>过滤器将被完全覆盖,同时丢失属性localeID
和角色
let queryObject: QueryObject;
let filters: Filters = { state: 'GB'}; // this obviously gives an error on Interface implementation
queryObject.filters = filters;
现在我正在获取原始对象,遍历属性并用更新的值覆盖它
const queryObject: QueryObject = _.cloneDeep(this.queryObject);
queryObject.filters.state = state; // 'GB'
this.portareService.update(queryObject, this.portareQuery.getActiveId());
使用对象解决此问题会很好。分配或传播…
解决方案如下:
{
return ...createQueryObject, updatedQueryObject
}
我知道如何使用循环函数实现这一点,但正在寻找一种函数编程方法。您可以为
QueryObject
和过滤器实现concat
方法。在concat
中,定义要使用的“合并逻辑”。QueryObject
在内部调用Filters
”concat方法
在concat
方法中,您可以使用扩展语法或任何其他逻辑来确保创建了新对象,并且没有任何变化
通过添加empty
构造函数,您可以轻松地开始在reduce
或其他自动合并中使用这些级联器
我觉得非常鼓舞人心。有一些关于空部分的信息
const QueryObject=({id=null,path=null,filters=filters.empty()})=>({
身份证件
路径
过滤器,
concat:other=>QueryObject({
id:other.id | | id,
路径:other.path | | path,
过滤器:filters.concat(其他过滤器)
}),
toString:()=>`QueryObject(${id},${path},${filters.toString()})`
});
QueryObject.empty=()=>QueryObject({});
QueryObject.merge=(x,y)=>x.concat(y);
常量筛选器=({state=null,localeID=null,role=null})=>({
国家,,
localeID,
角色
concat:other=>过滤器({
州:其他州,
localeID:other.localeID | | localeID,
角色:其他角色
}),
toString:()=>`过滤器(${state},${localeID},${role})`
});
Filters.empty=()=>Filters({});
Filters.merge=(x,y)=>x.concat(y);
const userFilter=Filters({role:“User”});
const gbFilter=Filters({localeID:“GB”});
常量过滤器设置=[userFilter,gbFilter];
const mergedFilter=filterSettings.reduce(Filters.merge,Filters.empty());
console.log(
“合并筛选器:”,
mergedFilter.toString()
);
//一些基本查询
const accountQuery=QueryObject({id:“CUSTOM_Q_1”,路径:“/accounts”});
//派生查询
const userQuery=accountQuery.concat(QueryObject({filters:userFilter}));
const gbQuery=accountQuery.concat(QueryObject({filters:gbFilter}));
console.log(
“用户查询:”,
userQuery.toString()
);
console.log(
“Brittish用户查询”,
userQuery.concat(gbQuery.toString())
);代码>感谢这一详尽的答案和片段!所以我想没有实用的速记方法?;-)超链接和所有这些东西都很吸引人。我添加了一个更通用的nullMerge
策略示例,您可以将其用作实用工具。不过,我更喜欢更具体的方法:)