输入: [{:a "ID1" :b 2} {:a "ID2" :b 4}]
我只想将所有键加起来:b并生成以下内容:
结果: 6
我想过filter?将所有数字拉入向量并将其全部加起来,但这似乎做了两次工作。我不能merge-with +在这里使用,因为里面:a有一个字符串。我是否使用reduce带有可拉出适当键的函数的here ?
(reduce (fn [x] (+ (x :b))) 0 list-of-maps)
如果我可以保留具有更新值的地图结构会更好,({:a "ID1" :b 6})但由于我真的不需要其他键,所以总和就可以了。
我只想将所有键相加 :b 并生成以下内容:
结果:6
我相信可行的代码是:
(def m1 {:a 1, :b 2})
(def m2 {:a 11, :b 12})
(def m3 {:a 21, :b 22})
(def ms [m1 m2 m3])
(->> ms
(map :b)
(reduce +))
Run Code Online (Sandbox Code Playgroud)
我觉得使用->>here 可以帮助您提高可读性。
这表示对 采取行动ms,它被定义为一个映射向量,通过剩余的形式将增量结果线程化。
第一件事是使用关键字:b作为每个条目的函数转换映射的每个条目,提取与该键对应的值,从而产生序列:
(2 12 22)
Run Code Online (Sandbox Code Playgroud)
然后,您可以reduce完全按照直觉应用该序列以获得结果:
user=> (def m1 {:a 1, :b 2})
#'user/m1
user=> (def m2 {:a 11, :b 12})
#'user/m2
user=> (def m3 {:a 21, :b 22})
#'user/m3
user=> (def ms [m1 m2 m3])
#'user/ms
user=> (->> ms
#_=> (map :b)
#_=> (reduce +))
36
Run Code Online (Sandbox Code Playgroud)
我对问题的这一部分的意图感到有些困惑:
如果我可以保留具有更新值的地图结构({:a“ID1”:b 6}),那就更好了
你想让:b所有地图的每个值都包含在结果中的所有值的总和,还是其他什么?