Javascript 在分层数组中深度查找、删除和更新

Javascript 在分层数组中深度查找、删除和更新,javascript,functional-programming,ramda.js,Javascript,Functional Programming,Ramda.js,假设我们有一棵树,如: const项=[ { “id”:1 }, { “id”:2, “项目”:[ { “id”:3 }, { “id”:4, “项目”:[] } ] } ]; 我正在寻找一种有效的方法来删除/更新一个项目的唯一id;主要问题是我们不知道项的确切路径,更糟糕的是:树可能有n个级别,而我们只有一个id。删除节点及其子节点 这里有一种使用flatMap和交互递归的有效技术- del接受一个节点数组t、一个查询q,并在每个带有查询的节点上调用del1 del1接受单个节点、t、查询、

假设我们有一棵树,如:

const项=[
{
“id”:1
},
{
“id”:2,
“项目”:[
{
“id”:3
},
{
“id”:4,
“项目”:[]
}
]
}
];

我正在寻找一种有效的方法来删除/更新一个项目的唯一id;主要问题是我们不知道项的确切路径,更糟糕的是:树可能有n个级别,而我们只有一个id。

删除节点及其子节点

这里有一种使用
flatMap
和交互递归的有效技术-

  • del
    接受一个节点数组
    t
    、一个查询
    q
    ,并在每个带有查询的节点上调用
    del1
  • del1
    接受单个节点、
    t
    、查询、
    q
    ,并调用节点项上的
    del
  • constdel=(t=[],q=null)=>
    t、 平面图(v=>del1(v,q))//
    q==t.id
    ? []
    
    :{…t,items:del(t.items,q)}//谢谢:D太棒了!我也读过你的链接问答。但仍然不知道如果更新一个项目,我们应该怎么做?“如果更新一个项目”?我不知道你是什么意思,我一如既往地爱你。我倾向于使用任意谓词代替查询参数。我认为这两个例子都是“是一种特殊形式的”真的应该写“可以使用”来实现”
    reduce
    功能强大,可以使用它编写许多数组方法。但这并不意味着,除非从最狭义的技术意义上说,它们是它的专门化。我的意思是,不要删除具有特定id的项,而是更新它,更改该项的其他属性。将
    {id:1,name:“Max”}
    更新为
    {id:1,name:“Alex”}
    。再次感谢!我自己想出来的。@Thankyou的答案很好。Ramda在这里可能不会提供太多帮助,因为Ramda并不是专门设计用于递归工作的,这肯定是一个递归问题。