Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.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 功能性;“向上插入”;对象嵌套数组中的嵌套数组:如何使用光学元件?_Javascript_Typescript_Functional Programming_Traversal_Lenses - Fatal编程技术网

Javascript 功能性;“向上插入”;对象嵌套数组中的嵌套数组:如何使用光学元件?

Javascript 功能性;“向上插入”;对象嵌套数组中的嵌套数组:如何使用光学元件?,javascript,typescript,functional-programming,traversal,lenses,Javascript,Typescript,Functional Programming,Traversal,Lenses,假设我有以下类型 接口状态{ 家长:家长[] } 接口父级{ uniqueName:string 儿童:儿童[] //其他道具 } 接口子{ uniqueName:string 父名称:字符串 //其他道具 } declare const upsert:(c:Child)=>Parent[]=>Parent[] 我想写最后一个函数,upsert。在功能上是否有一种规范的方法来实现这一点,如果给定一个子项(可能是新的子项或修改过的子项,函数将检查每个父项,并更新匹配的子项(match byuni

假设我有以下类型

接口状态{
家长:家长[]
}
接口父级{
uniqueName:string
儿童:儿童[]
//其他道具
}
接口子{
uniqueName:string
父名称:字符串
//其他道具
}
declare const upsert:(c:Child)=>Parent[]=>Parent[]
我想写最后一个函数,
upsert
。在功能上是否有一种规范的方法来实现这一点,如果给定一个子项(可能是新的子项或修改过的子项,函数将检查每个父项,并更新匹配的子项(match by
uniqueName
),或者如果找不到匹配的子项,则插入输入子项

更新部分是简单的光学元件:

const update=child=>
父遍历
.filter(matchesNameOf(child.parent))
.composeLens(_儿童)
.composeTraversal(子遍历)
.过滤器(匹配名称(子项))
.集(子)(州.父母)
插入零件是一个组合:

const insert=child=>
父遍历
.filter(matchesNameOf(child.parent))
.composeLens(_儿童)
.modify(cs=>snoc(cs,child))(state.parents)
如果我提前知道我是在更新还是在插入,那么我可以这样做

if(isNew)插入(子项)(状态)
else更新(子项)(状态)
但是,有没有一种完全实用的方法来组合这些功能,特别是如果您事先不知道它是更新还是插入

编辑应评论员的请求,我将指定:

declare const\u子项:镜头
声明常量parentTraversal:Traversal
声明const childTraversal:Traversal
declare const matchesNameOf:(a:a)=>(b:a)=>布尔值

然后
filter
composeTraversal
composeLens
set
modify
是属于镜头和遍历的标准光学功能

请提供您的所有代码。
父遍历
子遍历
匹配
的定义在哪里,
\u children
composeLens
composeTraversal
set
modify
,等等?请提供一个答案。哦,哎呀,我没有指定我使用的是
fp ts
。你所问的问题有一半是该库的内置函数!但我没有要求更正我的代码,所以是最小的可复制性示例似乎没有必要。我问的是如何做一些事情,并提供代码只是为了展示我所做的尝试。这类似于我问是否有一个表示可空性/可选性的单子,以及如何不需要一个最小的可复制示例来回答(“是的,可能是单子”)我的代码坚如磐石,工作正常。但我想问的是,是否有一种规范的方法可以使用光学技术进行升级。(显然,答案可能与消色差镜头有关,它既可以创建,也可以更新)