【发布时间】:2021-09-03 15:38:36
【问题描述】:
我想选择要保留的深度嵌套地图的路径。
例如:
{:a 1
:b {:c [{:d 1 :e 1}
{:d 2 :e 2}]
:f 1}
:g {:h {:i 4 :j [1 2 3]}}}
我想按路径选择,像这样:
(select-paths m [[:a]
[:b :c :e]
[:b :f]
[:g :h :i]])
这会返回
{:a 1
:b {:c [{:e 1}
{:e 2}]
:f 1}
:g {:h {:i 4}}}
与 Elasticsearch 的 fields 参数基本相同。路径参数的格式可以是别的,这只是第一个想法。
我尝试了两种不同的解决方案
- 遍历整个地图并检查当前元素的完整路径是否在给定路径中。我不知道如何处理地图列表,以便将它们保存为地图列表。
- 从给定路径创建
select-keys语句,但我再次遇到地图列表问题 - 特别是尝试解决具有某些共同深度的不同深度的路径。
我查看了幽灵,但我没有看到任何可以做到这一点的东西。我提出的任何基于map 或postwalk 的解决方案都会在某些时候变得令人难以置信的复杂。我一定是想错了。
如果有办法使用原始 json 执行此操作,那也很好。甚至是 Java 解决方案。
【问题讨论】:
-
多条路径以同一个关键字开头会怎样?如果路径不存在会怎样?因为 nil 传播是默认的,那是你想要的吗?
-
在示例中,有两条路径以相同的
[:b :c :e]和[:b :f]开头。基本上你会找到最深的共同元素。虽然我愿意将它定义为[:b [:f [:c :e]]]],如果它更容易处理的话。nil缺少路径是期望的结果。 -
好吧,我的午休时间快结束了,但如果有人没有击败我,我今晚会尝试编写解决方案。
标签: clojure