输入:[{:a "ID1" :b 2} {:a "ID2" :b 4}]
我想只添加所有键:b
并生成以下内容:
结果:6
我考虑过做一个filter?
将所有数字拉到矢量中并将其全部添加起来,但这似乎是两次工作。我不能在merge-with +
使用:a
,因为reduce
中有一个字符串。我是否在这里使用(reduce (fn [x] (+ (x :b))) 0 list-of-maps)
函数来提取相应的密钥?
({:a "ID1" :b 6})
如果我能保留具有更新值{{1}}的地图结构会更好,但由于我并不真正需要其他键,所以只需要总和就可以了。
答案 0 :(得分:4)
我想只添加所有键: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 +))
我觉得在这里使用->>
可以帮助您处理可读性。
这表示对ms
采取行动,:b
被定义为地图矢量,threading通过其余表格增加结果。
第一件事是使用关键字(2 12 22)
作为函数对每个地图条目进行转换,从而获取与该键对应的值,从而生成序列:
reduce
然后,您可以完全按照直觉穿过该seq来应用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
以获得结果:
:b
我对这部分问题的意图感到困惑:
如果我能保留具有更新值的地图结构({:a" ID1":b 6}),那就更好了。
您是否希望所有地图中的Set
的每个值都包含结果中的所有值或其他内容?
答案 1 :(得分:1)
(reduce + (map :b list-of-maps))
答案 2 :(得分:0)
这很简单但有效! 用户=> (+(你的地图:b)(你的地图:b))
或
user=> (def x [{:a "ID1" :b 2} {:a "ID2" :b 4}])
#'user/x
user=> (+ ((first x) :b) ((second x) :b))
6
user=>
or user=> (+ ((nth x 0) :b) ((nth x 1) :b))
6