Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 以功能编程方式将道具从obj复制到obj_Javascript_Functional Programming_Copy - Fatal编程技术网

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
策略示例,您可以将其用作实用工具。不过,我更喜欢更具体的方法:)