我有两个地图包含项目:添加收藏从1项集2,如果收集2不从收集1
(def people {:1 "John" :2 "Paul" :3 "Ringo" :4 "George"})
(def band
{:data
{:members
{:1 {:id 1 :name "John"}
:2 {:id 2 :name "Paul"}}}})
我要循环people
并添加这不[:data :members]
存在band
任何成员,导致:
(def band
{:data
{:members
{:1 {:id 1 :name "John"}
:2 {:id 2 :name "Paul"}
:3 {:id 3 :name "Ringo"}
:4 {:id 4 :name "George"}}}})
这是我已经试过:
(for [[id name] people]
(when-not
(contains? (get-in band [:data :members]) id)
(assoc-in band [:data :members id] {:id id :name name})))
其中产量:
({:data
{:members
{:4 {:id :4, :name "George"},
:1 {:name "John", :id 1},
:2 {:name "Paul", :id 2}}}}
nil
nil
{:data
{:members
{:1 {:name "John", :id 1},
:2 {:name "Paul", :id 2},
:3 {:id :3, :name "Ringo"}}}})
我不知道为什么我找回什么看起来是band
每个突变的列表。我在这里做错了什么?我如何将people
的缺失成员添加到band [:data :members]
?
感谢您的详细解释。我并没有意识到“什么时候不行”和“如果不行”的区别 - 非常有帮助! –
在函数签名中关于'[id name:as person]'的问题 - 你是否包含':as person'来说明'id'和'name'是一个人的属性?这是一个成语吗?我认为这绝对可以使代码的意图清晰。 –
是的,你也可以在之后引用'person'来表示整个集合,但是我只是把它包含来帮助传达意图(我喜欢给一个:作为解构的名称,除非我有一个令人信服的理由不要) – noisesmith