Given these points I would probably just do:

(defn update-val-with-id [values m]
    (map (fn [v]
                 (if (= (:id v) id)
                     (merge v m)
                      v))
              values))

I'm not that happy with it either, so other suggestions are welcome.

On 27 January 2015 at 00:06, Josh Stratton <strattonbra...@gmail.com> wrote:
> They're not keyed by id because order in both the category and its items is
> important. I could maintain the order explicitly, but that just makes other
> problems like reordering more difficult.
>
> As a couple people have suggested I could access the page using vector
> indexing, but then I'd need to figure out what those induces are for the
> category and the page given the item id. That seems reasonable, but I'm not
> sure the best way to do that. I'm sure there's some python enumerate
> equivalent where I can map all categories and items and filter down just the
> pair with the matching item id.
>
> On Jan 26, 2015 7:47 AM, "Michael Willis" <willismich...@gmail.com> wrote:
>>
>> Now that I think about it, I wonder why your categories aren't keyed by
>> id, like this:
>>
>> (def categories [ {1 {:text "foo"} 2 {:text "bar" :ack 5}} {3 {:age 7}}])
>>
>> Then the update-in can take the category id, instead of having to know its
>> index within a vector:
>>
>> (update-in categories [1 3]  merge { :age 12 :somethingElse 29 })
>> [{1 {:text "foo"}, 2 {:text "bar", :ack 5}} {3 {:age 12, :somethingElse
>> 29}}]
>>
>>
>> On Monday, January 26, 2015 at 9:42:56 AM UTC-6, Michael Willis wrote:
>>>
>>> (def categories [ [ { :id 1 :text "foo" } { :id 2 :text "bar" :ack 5 } ]
>>> [ { :id 3 :age 7 } ] ])
>>> #'user/categories
>>> (update-in categories [1 0] merge { :age 12 :somethingElse 29 })
>>> [[{:text "foo", :id 1} {:text "bar", :ack 5, :id 2}] [{:age 12,
>>> :somethingElse 29, :id 3}]]
>>>
>>>
>>> On Monday, January 26, 2015 at 8:54:58 AM UTC-6, Erik Price wrote:
>>>>
>>>> Many functions that affect keyed collections will work on vectors if you
>>>> supply the numeric index as a key.
>>>>
>>>> e
>>>>
>>>> On Monday, January 26, 2015, Josh Stratton <stratto...@gmail.com> wrote:
>>>>>
>>>>> I'm new to clojure and FP in general.  One thing that has always been a
>>>>> little confusing for me is working with immutable trees.  I have a vector 
>>>>> of
>>>>> categories, each category containing a vector of items--each one a 
>>>>> hashmap.
>>>>> In that hashmap I have a bunch of attributes including an item-id.  Now,
>>>>> assuming I have an item id, what's the easiest way to update the 
>>>>> appropriate
>>>>> hashmap?  I can't use an assoc, I believe, because my data is in a
>>>>> vector--not keyed by the id.
>>>>>
>>>>> What I have been doing is writing a function that maps the categories
>>>>> to new categories and then write another function that is called on every
>>>>> item and updates it iff the item id matches.  This works, but it seems
>>>>> really clunky and I'm assuming there's a simpler way to do it.
>>>>>
>>>>> ; categories is a vector of item vectors, where the item is a hash
>>>>> (def categories [ [ { :id 1 :text "foo" } { :id 2 :text "bar" :ack 5 }
>>>>> ] [ { :id 3 :age 7 } ] ])
>>>>>
>>>>> Is there a more elegant workflow for updating categories?  Let's say I
>>>>> want to update item of id 3 with { :age 12 :somethingElse 29 }, what's the
>>>>> easiest way to do this?
>>>>>
>>>>> ; so the return would be
>>>>> [ [ { :id 1 :text "foo" } { :id 2 :text "bar" :ack 5 } ] [ { :id 3 :age
>>>>> 12 :somethingElse 29 } ] ]
>>>>>
>>>>> --
>>>>> You received this message because you are subscribed to the Google
>>>>> Groups "Clojure" group.
>>>>> To post to this group, send email to clojure@googlegroups.com
>>>>> Note that posts from new members are moderated - please be patient with
>>>>> your first post.
>>>>> To unsubscribe from this group, send email to
>>>>> clojure+unsubscr...@googlegroups.com
>>>>> For more options, visit this group at
>>>>> http://groups.google.com/group/clojure?hl=en
>>>>> ---
>>>>> You received this message because you are subscribed to the Google
>>>>> Groups "Clojure" group.
>>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>>> an email to clojure+unsubscr...@googlegroups.com.
>>>>> For more options, visit https://groups.google.com/d/optout.
>>
>> --
>> You received this message because you are subscribed to the Google
>> Groups "Clojure" group.
>> To post to this group, send email to clojure@googlegroups.com
>> Note that posts from new members are moderated - please be patient with
>> your first post.
>> To unsubscribe from this group, send email to
>> clojure+unsubscr...@googlegroups.com
>> For more options, visit this group at
>> http://groups.google.com/group/clojure?hl=en
>> ---
>> You received this message because you are subscribed to the Google Groups
>> "Clojure" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to clojure+unsubscr...@googlegroups.com.
>> For more options, visit https://groups.google.com/d/optout.
>
> --
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to clojure@googlegroups.com
> Note that posts from new members are moderated - please be patient with your
> first post.
> To unsubscribe from this group, send email to
> clojure+unsubscr...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/clojure?hl=en
> ---
> You received this message because you are subscribed to the Google Groups
> "Clojure" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to clojure+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to